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

时间:2012-01-20 03:07:01

标签: c# java interface override

This question给出了Java的@Override在方法上具有override关键字的C#等价物的答案。但是,从Java 1.6开始,@ 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
}

4 个答案:

答案 0 :(得分:8)

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

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() {}
} 

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

答案 1 :(得分:1)

虽然VB.Net没有,但并非如此。

您可以明确地实现该方法,并将其调用为普通的公共版本:

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

答案 2 :(得分:1)

如上所述,您无法从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()
    { }
}

答案 3 :(得分:-1)

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

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

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

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