2010-05-03 83 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