2009-08-08 52 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(); 
} 

诀窍是要实现一个接口,但没有所有的接口成员在类公共成员。