相当于 Java 1.6 @Override 用于 C 语言接口#

2022-09-03 15:56:12

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

这样做的实际用途是,在Java中,当一个类声称它实现了一个接口方法时,当它不再实现时(例如,如果接口方法被删除),你会得到编译错误。C# 中是否有等效的功能?

一些代码示例:

爪哇岛:

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
}

答案 1

类似的功能:显式接口实现。

public interface IA { 
  void foo(); 
  // void bar(); // Removed method. 
} 

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

问题是,如果这样做,则无法通过指针(从类内部)或通过计算结果为 的表达式来调用方法 -- 现在需要强制转换为 。thisBIA

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

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

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


答案 2

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

您可以显式实现该方法,并让它调用正常的公共版本:

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