2012-11-06 70 views
2

對於某些情況下 - 這是前面問題的擴展。創建列表<genericBaseClass <T>>來自各種列表<derivedClass <T>>

override List<baseClass> with List<derivedClass>

反正

我有一個通用的基礎類 「場景」

public class Scene<T> where T: SceneModel { } 

我也有兩班從這個繼承:

public class WorldScene : Scene<WorldModel> { } 
public class BattleScene : Scene<BattleModel> { } 

現在什麼我需要做的是有一個List<Scene<SceneModel>>其中包含一個mi WorldScene和BattleScene的結構。在我需要列表的地方,我顯然只需要使用WorldScene和BattleScene共有的屬性/方法。

我得到他們是兩個截然不同的對象 - 但鑑於他們繼承了同樣的事情 - 我希望有一些聰明的方式將它們按這種方式分組,而無需手動將它們轉換爲某種第三種類型。

+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

你不能只是創建battlescene和worlscene的父類的列表。父母將包含常用方法。由於battelscene和worldscene都是它們的父類,因此可以將它們存儲在列表中並調用常用方法。 –

回答

5

如果場景<牛逼>的方法和屬性允許的話,你可以定義一個covariant generic interface IScene <出牛逼>哪個場景<牛逼>工具:

public interface IScene<out T> where T : SceneModel { } 
    // use of T is limited to return values and out parameters 

public class Scene<T> : IScene<T> where T : SceneModel { } 

List<IScene<SceneModel>> list = new List<IScene<SceneModel>>(); 
list.Add(new WorldScene()); 
list.Add(new BattleScene()); 

foreach (IScene<SceneModel> scene in list) ... 

如果沒有,你可以使用非通用接口或非泛型基類,但不能在通用成員中包含定義:

public interface IScene { } 
    // no T 

public class Scene<T> : IScene where T : SceneModel { } 

List<IScene> list = new List<IScene>(); 
list.Add(new WorldScene()); 
list.Add(new BattleScene()); 

foreach (IScene scene in list) ... 
0

問題是WorldSceneBattleScene不是來源於相同的普通類:Scene<WorldModel>Scene<BattleModel>是兩個不同的類。

我會介紹一個基類 - 或界面 - 聲明你需要使用的功能:

public class Scene<T> : BaseScene where T: SceneModel { } 

,然後申報表作爲List<BaseScene>

相關問題