代码之家  ›  专栏  ›  技术社区  ›  Manish Basantani

接口的隐式和显式实现

  •  12
  • Manish Basantani  · 技术社区  · 15 年前

    在升级过程中,我偶然遇到了这样的代码。

    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 回复  |  直到 15 年前
        1
  •  8
  •   Gishu    15 年前

    是的.看起来多余。

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

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

    您应该删除显式实现。但是,如果删除其他实现,您将约束客户机,使其不再可以调用ovar.getColumnsDefinition()-它们将 不得不 使用如上所示的接口变量。

        2
  •  4
  •   Marc Gravell    15 年前

    有关信息,您看到特定模式的主要时间是:

    • 非显式方法是 virtual abstract ,对于子类 override
    • 签名 public 方法不是 相当地 同样,例如,公共API有一个更具体的返回类型(对于 IEnumerable[<T>] ICloneable )
    • 我们不想这样 公众的 ,但我们希望它在类型内易于调用(不需要nop cast)

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