2012-11-06 39 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>

相关问题