可能重复:
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"); }
}
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
块中使用。