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

时间:2012-11-15 15:03:55

标签: c#

  

可能重复:
  C#: Interfaces - Implicit and Explicit implementation

我正在阅读有关界面重新实现的内容。 我不确定这是什么意思? “隐式实现成员并明确实现成员”

示例代码:

明确的成员实施:

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"); }
}

隐式成员实施:

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

1 个答案:

答案 0 :(得分:7)

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

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()。但是当你在文本框变量上点击.时,没有任何方法可用。您需要将textbox变量转换为显式实现的接口类型:

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

为什么要隐藏一些接口实现?保持对象API更干净。 .net:List<T>中的示例隐式实现IList<T>,但隐藏了非泛型IList的实现。因此,您可以传递非通用IList所需的列表,但Add(object value)等非泛型方法不会污染漂亮的通用接口。

IDisposable相同 - 您可以使用名为Close的明确方法并明确实施Dispose(将调用您的Close方法)。 API将是干净的 - 只有Close可见。但是您的对象可以在using块中使用。