我有一个继承接口的类。接口成员方法是在我的类中实现的,没有访问修饰符(因此,默认情况下它是私有的)。
我收到错误“无法实现接口成员,因为它不公开”。
为什么不允许这样做?我不能覆盖辅助功能吗?
答案 0 :(得分:32)
以下是为什么能够覆盖可见性没有意义的示例:
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();
}
当你的工人属于B型时会发生什么?你正在调用一个方法,好像它是公开的,但它是一个私有方法。如果你想要这个功能,那么它不是真正的私有方法吗?
如果您只希望通过界面引用它时公开,那么您可以将其定义为:
public class B : someI
{
void someI.doYourWork()
{
//...
}
}
你最终得到了这个:
var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible
答案 1 :(得分:20)
方法必须实现public
,因为它们必须通过接口可调用,因此可以从接口作为类型访问。
您可以在此处选择“更改”该方法的可见性。给出:
public interface IFoo
{
bool IsFoo();
}
一个。实施方法 explicitly
public class Foo : IFoo
{
bool IFoo.IsFoo() { return true; }
}
该方法只能通过界面(在这种情况下为IFoo
)提供。)
B中。更改界面的可见性
将界面定义为internal
而不是public
。因此,Foo
也必须internal
。
答案 2 :(得分:5)
要求将接口实现公开只是一个逻辑要求。当你实现一个接口时,你告诉编译器“嘿,我实现了这个接口上的每个方法”。因此,将该方法设为私有使其不再可访问 - 并且逻辑上未实现。接口用作代码的契约,该代码使用您的对象,表示您始终可以调用我对象上的接口中定义的任何方法。如果实施方法是私有的,则不再适用。
如果你想隐藏你的实现,比如Intellisense,那么你可以简单地实现这个方法,就像@Bryan提到的那样。