C#继承了实现接口的protected方法

时间:2009-08-08 19:16:22

标签: c# class inheritance interface-implementation

我在C#

中有这个类/接口定义
public class FooBase {
    ...
    protected bool Bar() { ... }
    ...
}

public interface IBar {
    bool Bar();
}

现在我想创建一个派生自FooBase实现IBar的类Foo1:

public class Foo1 : FooBase, IBar {
}

是否有一些类声明魔法,编译器将继承的受保护方法作为接口的可公开访问的实现?

当然是Foo1方法

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

的工作原理。我只是好奇是否有捷径;)

省略此方法会导致编译器错误:Foo1未实现接口成员IBar.Bar()。 FooBase.Bar()是静态的,不是公共的,或者返回类型错误。

说明:我将代码继承(类层次结构)和功能实现(接口)分开。因此,对于实现相同接口的类,访问共享(继承)代码非常方便。

3 个答案:

答案 0 :(得分:5)

没有捷径。事实上,这个模式在我见过的一些地方使用过(不一定是ICollection,但你明白了):

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

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

答案 1 :(得分:1)

我相信你的代码尽可能短。不要以为那里有任何捷径。

答案 2 :(得分:1)

受保护的成员 FooBase.Bar()不是接口 IBar 的实现方法。界面需要公共方法 Bar()

实现接口有两种方法。显式实现或隐式实现。

以下是显式实施。如果通过IBar变量调用Foo的对象,则调用此方法。

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

定义公共方法Bar()是隐式实现

为了让编译器满意,你可以覆盖或者将baseclass方法新建为public(如果方法在baseclass中受到保护,则不是一个好的建议)。

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

诀窍是实现一个接口,但没有将所有接口成员作为类中的公共成员。