-4

可能重复:
C#:接口 - 隐式和显式实现

我正在阅读有关接口重新实现的信息。我不确定这是什么意思?“隐式实现成员和显式实现成员”

示例代码:

显式成员实现:

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

1 回答 1

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

 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块中使用。

于 2012-11-15T15:06:20.673 回答