2014-02-05 69 views
1

請看下面的非編譯C#代碼在同級別覆蓋的方法:覆蓋和

public abstract class Operation 
{ 
    public abstract void Work(); 
} 

public abstract class Operation<T> : Operation 
{ 
    public override void Work() 
    { 
     Work(); 
    } 

    public new abstract T Work(); 
} 

雖然可以引入一個新的名字在基類中重寫一個,它似乎並沒有被可能仍然覆蓋基類中的前一個方法 - 爲了執行覆蓋,必須定義衝突的方法。

有沒有我忽略的東西,或者這是不可能做到的?

+2

方法不能因返回類型而異 – vmeln

+0

當您遇到編譯器錯誤時,請嘗試讀取它。如果你不理解它,請提出一個關於它的問題,但請包括錯誤信息。 –

+1

嘗試在新的Work方法中放置base.Work()。它應該是「新的虛擬」,而不是抽象的 – Frode

回答

1

第一個選項,就像你可能不喜歡聽的話,就是你可以簡單地想出新的方法名稱,而不是陰影的另一種方法:

但是,另一個更激進的改變會是Operation是一個接口,而不是沒有實現的抽象類。

public interface IOperation 
{ 
    void Work(); 
} 

在這一點上,你還可以使繼承類型的接口爲好,因爲它並不需要實現:

public interface IOperationWithResult<T> : IOperation 
{ 
    T Work(); 
} 

或者你可以把它簡單地實現了一個抽象類接口明確:

public abstract class Operation<T> : IOperation 
{ 
    public new abstract T Work(); 

    void IOperation.Work() 
    { 
     Work(); 
    } 
} 

個人而言,我會去有兩個接口,在這裏沒有抽象類,因爲這些類型不是概念提供任何實際的實現,也不是他們在概念上抽象類型。他們的目的是定義一個合同,即許多其他不相關的類型可以滿足的合約(即做某些工作或計算某種結果的能力),這正是接口的用途。

+0

使用不同名稱的方法是我通常做的,是的,使一個接口也可以工作。我只是覺得可能有更好的辦法。 – John

+0

@John有一個更好的方法。使用兩個接口。正如我所說,這是這裏最好的解決方案。真的沒有任何理由有任何抽象類。作爲一般性建議,我建議你一般謹慎使用抽象類。我發現他們很少是大多數任務的合適工具。 (這通常歸結爲古老的說法:「支持組合而不是繼承」。) – Servy