2010-05-03 71 views
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:我明白接口的显式实现是非常重要的,当我们只需要在接口级别访问一个方法,并且使用两个具有相同方法签名的接口时,它就可以使用。

回答

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)

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

+0

为什么要有一个虚拟的非显式实现是一个明确的实现的原因?如果你实现了并且创建了一个子类,那么如果你调用引用子类对象的接口变量的方法会发生什么?你能提供一个例子吗? _also看到[我的问题](http://stackoverflow.com/q/10165296/537956)._ – comecme 2012-04-15 19:49:59