2012-08-06 84 views
2

我正在編寫具有封裝特定於每個特定子類的對象的超類的代碼,例如下面是子類型與它封裝的類的類型的示例關係。所有的封裝類也都隱式強制轉換爲它們封裝的類。 (非抽象的)。使用泛型將類型信息傳遞給超類

Item => Model.Item 
Box => Model.Box 

而不是使用非安全型型object我覺得我可以使用泛型來獲得類型安全和優雅。

public abstract class Entity<T> where T: class 
{ 
    protected T DataObject; 
} 

public class Item : Entity<Model.Item> 
{ 
    // Can use this.DataObject and it is type Model.Item 
} 

public class Box : Entity<Model.Box> 
{ 
    // Can use this.DataObject and it is type Model.Box 
} 

這種方式工作得很好,直到我想開始做第二層的子類,所以我改變的Item的定義(注意Model.AItem延伸Model.Item

public class Item<T> : Entity<T> where T : Model.Item 
{ 
    // Can use this.DataObject and it is type Model.Item 
} 

public class AItem : Item<Model.AItem> 
{ 
    // Can use this.DataObject and it is type Model.AItem 
} 

這對我的兩個主要問題,一個當我想引用一個二級對象作爲抽象類時,我必須將其放在那個Item<Model.Item>我希望有一種方法可以隱含這種方式,因爲永遠不會出現這種情況。而且它對我的抽象類的隱式轉換造成嚴重破壞,因爲它們不能被實例化。

沒有什麼不行,基本上我想刪除遺傳參數,同時仍然保持具有特定類型的封裝對象的能力。封裝的對象實際上是一個Linq to SQL對象,並且周圍的對象正在形成一種緩衝區,用於更改以及實現其他功能,並提供數據的更直接表示,就像它在應用程序中一樣。我需要保留LinqToSql實體,這樣我就可以繼續使用LinqToSql更新更改並管理插入/刪除操作,而無需重新發明輪子。我使用的是部分類來完成這個任務,但是與屬於不同數據上下文的對象混淆的太多了。

編輯:全文

我有一個是由不同類型的調查對象的調查評估。一些調查對象,如實際問題對象,由不同的其他對象組成。例如,一個塊是一個調查對象,它有一個迭代庫,項目庫由可以是許多不同類型的項目(當前表示爲子類)組成。到目前爲止,我一直使用Linq to SQL作爲我的模型,並通過部分類進行一些更改。項目的腳本在調查中調用項目之前和之後執行。這個腳本可以改變項目的某些屬性,但是由於我的linq類是我的模型,只要我通過linq的特性對它們進行更改,它就會將這些更改保存到數據庫中。

有沒有人看到更好的方式來做事情?

+1

您能否澄清一下*究竟*不適合您? – 2012-08-06 19:26:42

+0

基類使用子類的類型信息究竟是什麼? – 2012-08-06 19:29:22

+0

查看更新後的問題 – secretformula 2012-08-06 19:32:26

回答

2

請參閱this about covariance and contravariance。你也許可以作出interface IEntity<out T> where T : class { T DataObject { get; } },讓你的抽象類實現這一點,那麼你可以隱式做這樣的轉換:

IEntity<Model.AItem> a = //something 
IEntity<Model.Item> b = a; //it works! 

如果你不能做到這一點使用一協變的接口,那麼你可以」不是在邏輯上做你想做的事情,你應該嘗試從其他角度找出解決方案。