C#中接口的Java 1.6 @Override等效

这个问题给出了Java的@Override在方法上具有override关键字的C#等价物的答案。 但是,从Java 1.6开始,@ Override注释也可以应用于接口。

实际使用的是,在Java中,当一个类声称它实现了一个接口方法时(例如,如果删除了接口方法),就会遇到编译错误。 C#中有相同的function吗?

一些代码示例:

Java的:

 public interface A { public void foo(); // public void bar(); // Removed method. } public class B implements A { @Override public void foo(); @Override public void bar(); // Compile error } 

C#:

 public interface IA { void Foo(); // void Bar(); // Removed method. } public class B : A { public override void Foo(); // Doesn't compile as not 'overriding' method public void Bar(); // Compiles, but no longer implements interface method } 

类似的function:显式接口实现。

 public interface IA { void foo(); // void bar(); // Removed method. } public class B : IA { void IA.foo() {} void IA.bar() {} // does not compile } 

问题是,如果你这样做,你不能通过this指针(从类内部)或通过计算结果为B的表达式调用方法 – 现在需要转换为IA

您可以通过创建具有相同签名的公共方法并将调用转发到显式实现来解决此问题,如下所示:

 public class B : IA { void IA.foo() { this.foo(); } public void foo() {} } 

然而,这不太理想,我从未在实践中看到它。

不是,尽管VB.Net确实如此。

您可以显式实现该方法,并将该调用称为普通公共版本:

 public void bar() { ... } void IA.bar() { bar(); } 

如上所述,您无法从C#中的接口单独获得这种控制。 但是,您可以从抽象类中获取它。 为了完整起见,您可以做以下事情:

 public interface IA { void Foo(); //void Bar(); - removed } public abstract class A : IA { virtual void Foo() { } // Removed method //virtual void Bar() //{ } } public class B : A { public override void Foo() { } //throws an error like the one you were receiving regarding no method to override. public override void Bar() { } } 

Java中的@Override接口意味着“实现”。 在Java中,类实现了一个接口方法,并且该方法的签名被更改,或者该方法从接口中删除,以后java编译器开始抱怨它。

这样它可以防止方法变为“死代码”,您必须删除@Override注释(因此方法成为常规方法)或删除或更改方法以再次匹配接口。 这是保持代码清洁的一个非常好的function。 我希望C#也有这个function。

我尽可能地使用显式实现。

顺便说一句:Resharper在方法实现接口方法时显示它。