2012-01-20 8 views
13

This question Javaの@Overrideは、メソッドのoverrideキーワードのC#に相当するという答えを示します。しかし、Java 1.6以来、@Overrideアノテーションはインタフェースにも適用できます。C#のインターフェイスのJava 1.6 @Overrideに相当する

実用的な使い方は、Javaでは、クラスがインタフェースメソッドをもはや必要としなくなったときに(例えばインタフェースメソッドが削除された場合)実装すると主張するときにコンパイルエラーが発生することです。同等の機能はC#にありますか?

いくつかのコード例:

の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 
} 
+0

私は混乱しています。 'A'が' bar'を定義していない場合、なぜ 'B'は' A.bar'を実装するのですか? 'A' *の子どもだけが' A'で定義されたメソッドを実装することを強制する方法を探していますか? –

+0

@M。Babcock私が守ろうとしているのは、Bの作者が 'A.bar()'を実装すると 'B.bar()'がコンパイルされるべきではないということです。これは、素朴な開発者がまず実装クラスをチェックせずに 'A.bar()'を削除した場合に特に当てはまります。 – Bringer128

答えて

8

同様のの機能があります:明示的なインターフェイスの実装が。今IAにキャストする必要がある -

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

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

問題は、あなたがこれを行う場合は、(クラス内から)またはBに評価される式によってthisポインタを通じてメソッドを呼び出すことはできませんということです。

あなたは同じシグネチャを持つpublicメソッドを作成し、そのような明示的な実装にコールを転送することによってすることを回避することができます。

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

しかし、これは非常に理想的ではない、と私は「VEの見たことがありませんそれは実際に行われた。

1

そうでもない、VB.Netはありませんが。

は、明示的にメソッドを実装し、それが通常の公開版を呼ぶかもしれない:

public void bar() { ... } 
void IA.bar() { bar(); } 
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() 
    { } 
} 
-1

Javaのインターフェイスの@Overrideは 'implements'を意味します。 Javaでは、クラスがインタフェースメソッドを実装し、そのメソッドのシグネチャが変更されたり、メソッドがインタフェースから削除されたりすると、後でjavaコンパイラはそれを不平にし始めます。

このようにしてメソッドが「デッドコード」になるのを防ぐには、@Overrideアノテーションを削除する必要があります(メソッドが通常のメソッドになるため)。これは、コードをきれいに保つ非常に便利な機能です。私もC#にこの機能を持たせたいと思います。

私は可能な限り明示的に実装します。

ところで、Resharperは、メソッドがインタフェースメソッドを実装しているときにそれを示します。

関連する問題