【问题标题】:difference b/w implicitly implementing a member and explicitly implementing a member in C# [duplicate]区别 b/w 在 C# 中隐式实现成员和显式实现成员 [重复]
【发布时间】: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"); }
}

【问题讨论】:

    标签: c#


    【解决方案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 块中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多