我在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()是静态的,不是公共的,或者返回类型错误。
说明:我将代码继承(类层次结构)和功能实现(接口)分开。因此,对于实现相同接口的类,访问共享(继承)代码非常方便。
答案 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();
}
诀窍是实现一个接口,但没有将所有接口成员作为类中的公共成员。