为什么在类中实现的C#接口方法必须是公共的?

我有一个inheritance接口的类。 接口成员方法是在我的类中实现的,没有访问修饰符(因此,默认情况下它是私有的)。

我收到错误“无法实现接口成员,因为它不公开”。

为什么不允许这样做? 我不能覆盖辅助function吗?

这是一个为什么能够覆盖可见性没有意义的示例:

interface someI { void doYourWork(); } public class A : someI { public void doYourWork() { //... } } public class B : someI { private void doYourWork() { //... } } void Main() { List workers = getWorkers(); foreach(var worker in workers) worker.doYourWork(); } 

当你的工人属于B型时会发生什么? 你正在调用一个方法,好像它是公开的,但它是一个私有方法。 如果你想要这个function,那么它不是真正的私有方法吗?

如果您只希望在通过界面引用时将其公开,那么您可以将其定义为:

 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

要求接口实现是公共的只是一个逻辑要求。 当你实现一个接口时,你告诉编译器“嘿,我实现了这个接口上的每个方法”。 因此,将该方法设为私有使其不再可访问 – 并且逻辑上未实现。 接口用作代码的契约,该代码使用您的对象,表示您始终可以调用我对象上的接口中定义的任何方法。 如果实施方法是私有的,则不再适用。

如果你想隐藏你的实现,比如Intellisense,那么你可以简单地实现这个方法,就像@Bryan所提到的那样。