我正在阅读有关界面重新实现的内容。 我不确定这是什么意思? “隐式实现成员并明确实现成员”
示例代码:
明确的成员实施:
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"); }
}
答案 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
块中使用。