C#:实现接口非公开成员需指定public?VS重写提示存疑
关于C#接口非公开方法实现的疑问
我阅读了微软关于C#8开始允许接口默认方法实现及访问修饰符的文章,但无法理解:为何在类中实现接口的非公开方法时,必须指定public访问修饰符?若使用与接口相同的修饰符,该方法不会被视为实现类的已实现方法。
示例代码如下:
interface aa { protected internal void jj(); internal void jj1(); protected void jj2(); private protected void jj3(); protected internal void ff() { } internal void ff1() { } protected void ff2() { } private protected void ff3() { } } class bb:aa { public void jj() { } public void jj1() { } public void jj2() { } public void jj3() { } public void ff() { } public void ff1() { } public void ff2() { } public void ff3() { } }
编辑补充:从评论得知我可能仅在重写公开成员,但Visual Studio提示我确实在重写,这是为何?
解答
C#里接口的成员本质上是公开的行为契约,哪怕给接口成员加了protected internal这类修饰符,也只是限制了这些成员的可访问范围,并没有改变它们作为接口契约的核心属性——类实现接口就是要兑现这个契约,所以实现的方法必须声明为public,才能保证通过接口引用的代码能正常调用到这些方法。
至于Visual Studio的“重写”提示,其实是个容易混淆的表述:接口的默认方法是接口自带的默认实现,你在类里写的同名方法并不是传统意义上的override(重写基类方法),而是在实现并替换接口的契约默认实现。VS把这个行为标注为“重写”,是从“替换默认实现”的角度出发的,但本质上还是接口契约的实现,所以必须遵循接口实现的规则——用public修饰符。
如果在类里用和接口相同的修饰符声明方法,编译器会把这个方法当成类自身的私有/受保护成员,而非接口契约的实现。这是因为接口的设计初衷是定义公共行为约定,只有公开的方法才能满足契约的通用性要求。
内容的提问来源于stack exchange,提问作者Eric Movsessian
相关产品推荐
相关产品推荐

