接口的隐式和显式实现

时间:2010-05-03 06:46:55

标签: c# .net interface

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

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:我理解接口的显式实现非常重要,当我们需要仅在接口级别访问方法时,可以使用它,并使用具有相同签名方法的两个接口。

2 个答案:

答案 0 :(得分:8)

烨。看起来多余。

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

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

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

答案 1 :(得分:4)

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

  • 对于virtual
  • 的子类,非显式方法为abstractoverride
  • public方法的签名不是完全相同,例如公共API具有更具体的返回类型(对于IEnumerable[<T>]或{{ 1}})。
  • 我们不希望它是ICloneable,但我们希望它可以在类型中轻松调用(不需要nop-cast)

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