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

Kun*_*esh 23 c# inheritance interface class

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

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

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

Rob*_*Rob 36

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class B : someI
{
    void someI.doYourWork()
    {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

你最终得到了这个:

var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible
Run Code Online (Sandbox Code Playgroud)

  • 我建议对于未密封的类,其实现不会公开具有相同名称和签名的公共类成员的接口应该使用受保护的虚拟成员来实现; 不幸的是,最接近的人可以在C#中做到这一点是让接口实现只是调用受保护的虚方法.否则,如果派生类重新实现接口,则无法调用父实现. (3认同)
  • 在vb.net中,可以说:`Protected Overridable Sub DoSomethingImpl()实现IDoSomething.DoSomething`; 外部代码只能通过接口调用该方法,但派生类将能够覆盖该方法,并在覆盖内调用父方法.在C#中,能够同样使用受保护的方法来实现接口将是有用的,但负责规范的人员不允许该选项.最接近的可能是使用调用受保护方法`DoSomethingImpl()`的方法显式实现接口.注意... (2认同)

Bry*_*ard 21

必须实现方法,public因为它们必须通过接口可调用,因此可以从接口作为类型访问.

您可以在此处选择一些选项来" 更改 "该方法的可见性.鉴于:

public interface IFoo 
{
    bool IsFoo();
}
Run Code Online (Sandbox Code Playgroud)

A. 明确地实施方法

public class Foo : IFoo
{
    bool IFoo.IsFoo() { return true; }
}
Run Code Online (Sandbox Code Playgroud)

该方法只能通过界面(IFoo在这种情况下).

B.更改界面的可见性

将接口定义为internal而不是public.因此,Foo必须internal也是如此.


Pau*_*der 5

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

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