2009-08-08 57 views
3

我有這個類/接口定義在C#C#繼承保護的方法實現接口

public class FooBase { 
    ... 
    protected bool Bar() { ... } 
    ... 
} 

public interface IBar { 
    bool Bar(); 
} 

現在我想創建FooBase派生的類Foo1實施伊巴爾:

public class Foo1 : FooBase, IBar { 
} 

有一些類聲明魔術師認爲編譯器將繼承的受保護方法作爲接口的公共可訪問實現?

當然,一個Foo1方法

bool IBar.Bar() 
{ 
    return base.Bar(); 
} 

作品。我只是好奇是否有一個快捷方式;)

省略此方法導致編譯器錯誤:Foo1不實現接口成員IBar.Bar()。 FooBase.Bar()是靜態的,不是公共的,或者返回類型錯誤。

說明:我分開代碼繼承(類層次結構)和功能實現(接口)。因此,對於實現相同接口的類,訪問共享(繼承)代碼非常方便。

回答

4

沒有捷徑。事實上,這種模式是我見過幾個地方使用(不一定ICollection,但你的想法):

public class Foo : ICollection 
{ 
    protected abstract int Count 
    { 
     get; 
    } 

    int ICollection.Count 
    { 
     get 
     { 
      return Count; 
     } 
    } 
} 
1

我相信你的代碼儘可能短。不要認爲那裏有任何一種捷徑。

1

受保護的成員FooBase.Bar()不是一種實現方法的接口IBar。界面要求公開方法Bar()

有2種實現接口的方式。顯式實現或隱式實現。

以下是顯式實現。如果通過IBar變量調用Foo的對象,則調用此方法。

bool IBar.Bar() 
{ 
    return base.Bar(); 
} 

定義的公共方法吧()是隱含實現

爲了讓編譯器滿意,你可以重寫或新的基類方法public(不是一個好的建議,如果方法在基類中保護)。

new public bool Bar() 
{ 
    return base.Bar(); 
} 

訣竅是要實現一個接口,但沒有所有的接口成員在類公共成員。