【问题标题】:Implicit and Explicit implementation of interface接口的隐式和显式实现
【发布时间】:2010-05-03 06:46:54
【问题描述】:

在进行升级时,我碰巧遇到了这样的代码。

interface ICustomization
    {
        IMMColumnsDefinition GetColumnsDefinition();
    }

    class Customization : ICustomization
    {
        private readonly ColumnDefinition _columnDefinition;

        //More code here.

        public ColumnsDefinition GetColumnsDefinition()
        {
            return _columnDefinition;
        }

        ColumnsDefinition ICustomization.GetColumnsDefinition()  //redundant
        {
            return GetColumnsDefinition();            
        }
    }

我的问题是: 在这段代码中是否需要/使用接口的“显式”实现? 如果我删除上面标记为“冗余”的方法(接口的显式实现)会产生任何问题吗?

PS:我知道接口的显式实现非常重要,它可以用于我们只需要在接口级别访问一个方法,并使用两个具有相同方法签名的接口。

【问题讨论】:

    标签: c# .net interface


    【解决方案1】:

    是的。看起来多余。

    通过 Customization 类型的引用和 ICustomization 类型的引用调用它会导致相同的行为。如果您希望下面的调用表现不同,那么显式实现该接口是有意义的。

    Customization oVar = new Customization();
    oVar.GetColumnsDefinition(); // calls 1st method
    ICustomization iVar = obj;
    iVar.GetColumnsDefinition(); // calls 2nd method - explicit impl.
    

    您应该删除显式实现。但是,如果您删除其他实现,您将限制客户端,使其无法再调用 oVar.GetColumnsDefintion() - 他们将必须使用如上所示的接口变量。

    【讨论】:

      【解决方案2】:

      关于信息,您看到特定模式的主要时间是(任何一个):

      • 非显式方法是virtualabstract,用于override 的子类
      • public 方法的签名完全不一样,例如公共 API 有一个更具体的返回类型(常见于 IEnumerable[<T>]ICloneable 之类的东西)。
      • 我们不希望它是 public,但我们希望它可以在类型中轻松调用(不需要 nop-cast)

      在这种情况下,它确实看起来是多余的。

      【讨论】:

      • 为什么有一个虚拟的非显式实现也是有一个显式实现的理由?如果你实现了这两者而不是创建一个子类,如果你在一个引用子类对象的接口变量上调用该方法会发生什么?你能举个例子吗? 另见my question
      猜你喜欢
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多