2012-01-20 42 views
13

This question給出了答案,Java的@Override在方法上具有C#等效的override關鍵字。但是,自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

類似功能:顯式接口實現。

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

不是真的,雖然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顯示它。