2

コンテキストによっては、これは以前の質問の拡張です。

List<baseClass> を List<derivedClass> でオーバーライドする

ともかく、

ジェネリック基本クラス「Scene」があります

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

これから継承する2つのクラスもあります。

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

ここで必要なのはList<Scene<SceneModel>>、WorldScene と BattleScene が混在する を用意することです。リストが必要な場合は、WorldScene と BattleScene に共通のプロパティ/メソッドを使用するだけでよいことは明らかです。

それらは2つの明確に異なるオブジェクトであることがわかりますが、同じものから継承していることを考えると、手動で3番目のタイプにキャストすることなく、この方法でそれらをグループ化する巧妙な方法があることを願っています.

4

2 に答える 2

5

Scene <T>のメソッドとプロパティで許可されている場合は、Scene<T>が実装する共変ジェネリックインターフェイスIScene<outT>を定義できます。

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) ...
于 2012-11-06T00:46:03.257 に答える
0

問題は、WorldSceneBattleSceneが同じ共通クラスから派生していないことです。Scene<WorldModel>Scene<BattleModel>は 2 つの異なるクラスです。

使用する必要がある機能を宣言する基本クラス (またはインターフェイス) を紹介します。

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

次に、リストを次のように宣言しますList<BaseScene>

于 2012-11-06T00:48:52.363 に答える