我经常需要实现一些接口,例如IEnumerable<T>在我的代码中.
每次,当自动实现时,我会遇到以下情况:
public IEnumerator<T> GetEnumerator() {
// Code here...
}
public IEnumerator GetEnumerator1() {
// Code here...
}
Run Code Online (Sandbox Code Playgroud)
虽然我必须实现两个GetEnumerator()方法,但它们不可能具有相同的名称,即使我们知道它们以某种方式执行相同操作.编译器不能将它们视为另一个的重载,因为只有返回类型不同.
这样做时,我设法将GetEnumerator1()访问者设置为private.这样,编译器就不会抱怨没有实现接口成员,而只是NotImplementedException在方法体内抛出一个.
但是,我想知道这是一个好的做法,还是我将以不同的方式进行,也许是方法别名或类似的东西.
实现接口时最好的方法是什么,例如
IEnumerable<T>需要实现两个具有相同名称的不同方法?
编辑#1
VB.NET在实现接口时的反应是否与C#不同,因为在VB.NET中它是明确实现的,因此强制执行
GetEnumerator1().这是代码:
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator
// Code here...
End Function
Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator Implements System.Collections.Generic.IEnumerable.GetEnumerator
// Code here...
End Function
Run Code Online (Sandbox Code Playgroud)
两种GetEnumerator()方法都是显式实现的,编译将拒绝它们具有相同的名称.为什么?
我写了一个泛型类型:IDirectorySource<T> where T : IDirectoryEntry,我使用的是通过我的接口的对象来管理Active Directory中的条目,其中:IGroup,IOrganizationalUnit,IUser.
这样我就可以写下面的内容:
IDirectorySource<IGroup> groups = new DirectorySource<IGroup>(); // Where IGroup implements `IDirectoryEntry`, of course.`
foreach (IGroup g in groups.ToList()) {
listView1.Items.Add(g.Name).SubItems.Add(g.Description);
}
Run Code Online (Sandbox Code Playgroud)
从IDirectorySource<T>.ToList()方法中,我使用反射来找出类型参数的适当构造函数T.但是,由于T给定了一个接口类型,它根本找不到任何构造函数!
当然,我有一个internal class Group : IGroup实现IGroup接口的.无论我多么努力,我都无法弄清楚如何通过我的实现类从我的界面中获取构造函数.
[DirectorySchemaAttribute("group")]
public interface IGroup {
}
internal class Group : IGroup {
internal Group(DirectoryEntry entry) {
NativeEntry = entry;
Domain = NativeEntry.Path;
}
// Implementing IGroup interface... …Run Code Online (Sandbox Code Playgroud) 我有一个包含48行整数的CSV文件.我使用visual c#的openfiledialog功能允许用户选择此文件.然后我想让程序将该文件截断为24行.是否有截断功能我可以轻松地使用它?如果不是我怎么能这样做?以下是我到目前为止的情况......
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace sts_converter
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void select_Click(object sender, EventArgs e)
{
int size = -1;
DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
if (result == DialogResult.OK) // Test result.
{
string file = openFileDialog1.FileName;
try
{
string text = File.ReadAllText(file);
size = text.Length;
}
catch (IOException)
{
} …Run Code Online (Sandbox Code Playgroud) 我目前正在使用本教程学习Win32 ,并且我很难用我显示的角色.
比如这段代码在创建时向我的窗口添加一个菜单:
case WM_CREATE: {
HMENU hMenu, hSubMenu;
HICON hIcon, hIconSm;
hMenu = CreateMenu();
hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "Exit");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "File");
hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "&GO");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Stuff");
SetMenu(hwnd, hMenu);
hIcon = LoadImage(NULL, "Stuff.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
if (hIcon)
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
else
MessageBox(hwnd, "Could not load large icon!", "Load Error", MB_OK | MB_ICONERROR);
hIconSm = LoadImage(NULL, "Stuff.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
if(hIconSm) …Run Code Online (Sandbox Code Playgroud) 我有一个接口和一个实现此接口的类.
public interface IPhase {
string Description { get; set; }
int Id { get; }
string Phase { get; set; }
}
public class Phase : IPhase {
// Implementation here...
}
Run Code Online (Sandbox Code Playgroud)
现在,使用NHibernate 2.1.2.GA,我希望使用table-per-class-hierarchy来映射接口及其实现者,实际上,我不需要一个鉴别器,因为这个实现者将是唯一的类持久化在这张表中.我现在还没有使用NHibernate大约一年半,我在这里遇到了一些内存空白......
我已经阅读了这个问题和相关的答案,除了我没有使用FNH.
NHibernate映射:将层次结构保存到单个表而不带鉴别器
我想知道这个discriminator属性在使用时是否是强制性的subclass?
在这个特定的上下文中,我的XML映射会是什么样子?
谢谢你的帮助!
nhibernate interface nhibernate-mapping table-per-hierarchy discriminator
这是NHibernate对Oracle数据库执行的查询:
select
compteurra0_.NO_SEQ_CPTE_RAPP_ACCES_INFO_DSQ as NO1_2_,
compteurra0_.TXT_INFO_COMPL as TXT2_2_,
compteurra0_.TYP_CPTE_RAPP_ACCES_DSQ as TYP3_2_,
compteurra0_.VAL_CPTE_RAPP_ACCES_DSQ as VAL4_2_,
compteurra0_.VAL_CPTE_ATNDU as VAL5_2_,
compteurra0_.ID_UTIL_CREAT_OCC as ID6_2_,
compteurra0_.DHC_OCC as DHC7_2_,
compteurra0_.NO_SEQ_RAPP_ACCES_INFO_DSQ as NO8_2_
from
ESO.ESO_V_CPTE_RAPP_ACCES_DSQ compteurra0_
Run Code Online (Sandbox Code Playgroud)
当我对数据库执行此查询时,它返回Oracle错误:
ORA-00972: identifier is too long我在互联网上搜索过,发现2005年使用NHibernate和Oracle报告了一个错误: Oracle issue: ORA-00972: identifier is too long
我找到了另外两个相关的SO问题,说明在Java中使用Hibernate的解决方案.
如果是这样,如何使它工作?
CompteurRapportAcces.cs
public class CompteurRapportAcces : AuditableEntity {
public virtual string InformationComplementaire { get; set; }
public …Run Code Online (Sandbox Code Playgroud) interface ×3
c# ×2
nhibernate ×2
.net ×1
.net-2.0 ×1
c ×1
csv ×1
generics ×1
ienumerable ×1
ienumerator ×1
menu ×1
ora-00972 ×1
oracle ×1
reflection ×1
sql ×1
truncate ×1
winapi ×1