2010-08-02 18 views
1

是否有一種方法可以覆蓋抽象類的方法簽名,它使用<T>和ClassName,所以我可以通過引用傳遞一個對象而不重複它?C# - 覆蓋<T>方法簽名與ClassName?

例如,我有一堆對象管理器。我希望它們都包含一個.Save(Object)方法,該方法將根據對象狀態(插入,更新,刪除等)執行適當的保存操作。

我試圖創建一個基類,它包含以下方法:

protected virtual bool Update<T>(ref T _object) where T : ObjectBase 
{ 
    throw new NotImplementedException(); 
} 

public virtual bool Save<T>(ref T _object) where T : ObjectBase 
{ 
    // Figure out which action to take based on _object's state and execute it 
} 

而且我希望我的繼承類的定義方法是使用下面的方法:

public override bool Update<Consumer>(ref Consumer _object) 
{ 
    return _service.UpdateConsumer(ref _object); 
} 

我的問題是,我不能指定<T>現在是<Consumer>,並保留在<T>我不能通過它參考

+2

爲什麼你需要指定'ref'?無論如何,它幾乎肯定是一個參考對象。一個意見的問題,但我會說'ref'是不好的形式。 – Jay 2010-08-02 14:38:08

+0

這不是什麼ref意味着...... ref表示實際參考被傳遞。因此,如果他將_object的值更改爲不同的對象,它將反映在_object的調用者引用中。但在這種情況下,我看不出有什麼理由讓他這樣做。 – 2010-08-02 14:40:59

+0

我通過引用傳遞,因爲_service是一個WCF服務,它根據數據庫輸入/輸出更改對象屬性。 – Rachel 2010-08-02 14:44:12

回答

6

而不是使方法本身成爲通用的,您應該使整個基類成爲通用的。

例如:

public abstract class ObjectManager<T> where T : ObjectBase { 
    protected abstract bool Update(T obj); 
} 

每個具體的ObjectManager應該繼承它管理的類型ObjectManager,像這樣:

public class ConsumerManager : ObjectManager<Consumer> { 
    protected override bool Update(Consumer obj) { 
     ... 
    } 
} 

注意,順便說一下,你的參數應該幾乎肯定不會通過ref
如果您想更改調用者的變量以指代不同實例,您只需要ref關鍵字。
欲瞭解更多信息,請參閱here

+0

你是什麼意思?這兩組代碼位於不同的類中,派生類從基類繼承。我只是排除了類定義,因爲我試圖簡化代碼。 – Rachel 2010-08-02 14:40:37

+0

咦?你在問什麼? – SLaks 2010-08-02 14:43:40

+0

謝謝,我不知道我能做到這一點。 – Rachel 2010-08-02 14:50:32