差异b / w隐式实现成员并在C#中显式实现成员


difference b/w implicitly implementing a member and explicitly implementing a member in C#

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
C#: Interfaces - Implicit and Explicit implementation

我在读关于界面重新实现的文章。我不确定这是什么意思?"隐式实现成员和显式实现成员"

样例代码:

显式成员实现:

1
2
3
4
5
6
7
8
9
public interface IUndoable { void Undo(); }
public class TextBox : IUndoable
{
void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
}
public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}

隐式成员实现:

1
2
3
4
public class TextBox : IUndoable
{
public void Undo() { Console.WriteLine ("TextBox.Undo"); }
}

显式接口实现允许您实现具有相同签名的成员的不同接口。它还允许您隐藏接口实现(实现的成员只能通过引用接口类型来使用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface IUndoable
{
   void Undo();
}

public interface IVeryUndoable
{
   void Undo();
}

public class TextBox : IUndoable, IVeryUndoable
{
     void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
     void IVeryUndoable.Undo() { Console.WriteLine ("TextBox.VeryUndo"); }
}

在这种情况下,您有两个具有相同签名的方法Undo()。但是当您在文本框变量上点击EDOCX1[1]时,没有任何方法可用。需要将文本框变量强制转换为显式实现的接口类型:

1
2
 IUndoable undoable = (IUndoable)textbox;
 undoable.Undo(); // now member available

为什么要隐藏一些接口实现?保持对象API更干净。来自.NET的示例:List隐式实现IList,但隐藏了非泛型IList的实现。因此,您可以传递期望使用非泛型IList,但像Add(object value)这样的非泛型方法不会污染好的泛型接口的列表。

IDisposable相同,您可以使用名称为Close的好方法,并显式实现Dispose(这将调用您的Close方法)。API将是干净的-只有Close是可见的。但是您的对象可以在using块中使用。