首页 文章

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

提问于
浏览
19

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

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

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

3 回答

  • 20

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

    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
    
  • 31

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

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

    public interface IFoo 
    {
        bool IsFoo();
    }
    

    A.实施方法explicitly

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

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

    B.更改界面的可见性

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

  • 5

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

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

相关问题