C#接口的非公共成员

jfs*_*jfs 30 .net c# interface

在C#中,当您实现接口时,所有成员都是隐式公共的.那岂不是更好,如果我们可以指定可访问修饰符(protected,internal,除了private当然的),或者我们应该使用抽象类呢?

Mar*_*ade 34

如果接口是内部接口,则其所有成员都将在程序集内部.如果嵌套接口受到保护,则只有外部类的子类才能访问该接口.

声明程序集之外的接口的内部成员将是毫无意义的,因为在声明外部类之外的接口的受保护成员也是如此.

接口的要点是描述实现类型和接口用户之间的契约.外部用户不会去关心,不应该关心的实现,这是内部和保护成员是.

对于由基类调用的受保护成员,抽象类是指定基类和从它们继承的类之间的契约的方法.但在这种情况下,实现细节通常非常相关,除非它是一个简并的纯抽象类(所有成员都是抽象的),在这种情况下受保护的成员是无用的.在这种情况下,请使用接口并保存单个基类以实现要选择的类型.


sam*_*son 20

您可以通过在方法名称之前显式声明接口名称来隐藏接口的实现:

public interface IInterface {
    public void Method();
}

public class A : IInterface {
    public void IInterface.Method() {
        // Do something
    }
}

public class Program {
    public static void Main() {
        A o = new A();
        o.Method(); // Will not compile
        ((IInterface)o).Method(); // Will compile
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是评论:现在你不能在接口成员或显式实现的接口方法中使用“public”修饰符。例如,为了使您的代码能够与 .NET 4.5 一起使用,只需删除两个“public”即可。 (2认同)

Ish*_*eel 5

没有意义.接口是与公众签订的合同,您支持这些方法和属性.坚持抽象类.

  • "内部"访问修饰符对于接口来说似乎是非常有用的东西; 在其任何成员上具有这样的修饰符的接口只能由声明它的程序集中的代码实现,但可以由代码在任何地方使用.我可以看到很多用途. (6认同)

naw*_*fal 5

这里的所有答案或多或少都表明接口应该是这样的,它们是通用的公共规范。

这是讨论最多的主题,当这个问题浮现在我的脑海时,让我发布我在 SO 上找到的两个很好的答案。

这个答案给出了一个例子,说明为派生类中的接口成员使用非统一访问说明符是多么荒谬。代码总是比技术描述更好。

对我来说,强制公共接口成员最糟糕的事情是接口本身可以在程序集内部,但它公开的成员必须是公共的。乔恩·斯基特 (Jon Skeet) 可悲地解释说,这是设计使然

这就提出了一个问题,为什么接口的设计不是为成员提供非公开定义。这可以使合同具有灵活性。在编写不希望类的特定成员暴露给程序集外部的程序集时,这非常有用。我不知道为什么。