为什么一个类中实现的C#接口方法必须公开?

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

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

为什么不允许? 我无法覆盖可访问性吗?


以下是为什么无法覆盖可见性的原因的一个例子:

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

方法必须public实现,因为它们必须通过接口进行调用,从而可以将接口作为类型进行访问。

您在这里有几个选项来“更改”该方法的可见性。 鉴于:

public interface IFoo 
{
    bool IsFoo();
}

A.明确实施该方法

public class Foo : IFoo
{
    bool IFoo.IsFoo() { return true; }
}

该方法只能通过接口(在这种情况下为IFoo )来使用。

B.改变界面的可见性

将界面定义为internal而不是public 。 因此, Foo也必须是internal


要求接口实现是公开的是一个合乎逻辑的要求。 当你实现一个接口时,你告诉编译器“嘿,我在这个接口上实现了每种方法”。 因此,将该方法设置为私有使其不再可访问 - 并且逻辑上不实现。 接口作为使用你的对象的代码的契约,说你总是可以调用我的对象的接口中定义的任何方法。 如果实施方法是私人的,那将不再是事实。

如果你想隐藏你的实现,比如说Intellisense,那么你可以简单地按照@Bryan提到的那样直接实现这个方法。

链接地址: http://www.djcxy.com/p/39433.html

上一篇: Why must an C# interface method implemented in a class be public?

下一篇: How can I get around ref parameters not allowing type variation?