在C#中隐式实现成员和显式实现成员的区别

  • 本文关键字:成员 实现 区别 c#
  • 更新时间 :
  • 英文 :


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

最新更新