我有一个继承了接口的类。在我的类中,实现了一个接口成员方法,但没有设置访问修饰符(因此默认为私有)。
我得到了一个错误提示:"无法实现接口成员,因为它不是公共的"。
为什么不允许这样做?我不能覆盖访问权限吗?
我有一个继承了接口的类。在我的类中,实现了一个接口成员方法,但没有设置访问修饰符(因此默认为私有)。
我得到了一个错误提示:"无法实现接口成员,因为它不是公共的"。
为什么不允许这样做?我不能覆盖访问权限吗?
以下是一个例子,解释了为什么允许重写可见性是毫无意义的:
interface someI
{
void doYourWork();
}
public class A : someI
{
public void doYourWork()
{
//...
}
}
public class B : someI
{
private void doYourWork()
{
//...
}
}
void Main()
{
List<someI> workers = getWorkers();
foreach(var worker in workers)
worker.doYourWork();
}
当你的工作者(worker)是B类型时,发生了什么?你调用了一个像公共方法一样的方法,但它是一个私有方法。如果你想要这个功能,那么它实际上不是一个私有方法,对吧?public class B : someI
{
void someI.doYourWork()
{
//...
}
}
最终你得到了这个结果:
var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible
方法必须实现为 public
,因为它们必须通过接口可调用,因此从接口作为类型可访问的地方调用。
这里有几个选项可以“更改”该方法的可见性。假设:
public interface IFoo
{
bool IsFoo();
}
A. 实现方法 明确
public class Foo : IFoo
{
bool IFoo.IsFoo() { return true; }
}
该方法仅可通过接口(在本例中为IFoo
)使用。
B. 更改接口的可见性
将接口定义为internal
而不是public
。然而,作为后果,Foo
也必须是internal
。
Protected Overridable Sub DoSomethingImpl() Implements IDoSomething.DoSomething
; 外部代码只能通过接口调用该方法,但派生类将能够重写该方法,并在重写中调用父方法。 在C#中,同样使用受保护的方法来实现接口会很有用,但是负责规范的人不允许该选项。 最接近的方法是使用一个显式实现接口的方法,该方法将调用受保护的方法DoSomethingImpl()
。 请注意... - supercatDoSomething()
而不是DoSomethingImpl()
,但使用前者的名称将防止派生类公开一个名为DoSomething()
的方法。 - supercat