接口的隐式和显式实现

12

在升级过程中,我偶然发现了这样的一段代码。

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个回答

8

是的。看起来有些重复。

通过自定义类型引用和ICustomization类型引用调用它会产生相同的行为。如果你想让以下调用产生不同的行为,那么明确地实现接口是有意义的。

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

你应该移除显式实现。但是,如果你移除其他实现,那么你会限制客户端的调用,他们不能再直接调用oVar.GetColumnsDefintion()了 - 他们必须像上面展示的那样使用一个接口变量。

4

需要注意的是,当以下情况之一出现时,您会看到特定的模式:

  • 非显式方法为virtualabstract,以供子类 override
  • public方法的签名不完全相同,例如公共API具有更具体的返回类型(对于诸如 IEnumerable[<T>]ICloneable 等常见情况)。
  • 我们不希望它是public,但我们希望它在类型内部易于调用(无需进行nop-cast)

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


拥有虚拟的非显式实现是为什么需要同时具备显式实现的原因?如果你同时实现了两者并创建一个子类,如果在接口变量上调用子类对象的方法会发生什么?能否提供一个例子?请参阅我的问题 - comecme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接