区别 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# 中隐式实现成员和显式实现成员 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle sql中的隐式和显式数据类型转换有啥区别

C#接口的隐式和显式实现

C#中的类型转换-自定义隐式转换和显式转换

activity的隐式和显式启动

隐式转换和显式转换及强制转换的区别

关于隐式转换和显式转换