区别 b/w 在 C# 中隐式实现成员和显式实现成员 [重复]
Posted
技术标签:
【中文标题】区别 b/w 在 C# 中隐式实现成员和显式实现成员 [重复]【英文标题】:difference b/w implicitly implementing a member and explicitly implementing a member in C# [duplicate] 【发布时间】:2012-11-04 05:06:16 【问题描述】:可能重复: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】:显式接口实现允许您实现具有相同签名成员的不同接口。它还允许您隐藏接口实现(实现的成员只能通过接口类型的引用获得):
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
块中使用。
【讨论】:
以上是关于区别 b/w 在 C# 中隐式实现成员和显式实现成员 [重复]的主要内容,如果未能解决你的问题,请参考以下文章