2012-11-06 4 views
2

일부 컨텍스트에서는 이전 질문의 확장입니다. 나는 일반적인 기본 클래스 "장면"가 목록 만들기 <genericBaseClass <T>> 여러 목록 <derivedClass >

어쨌든

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의 xture. 목록이 필요한 곳에서는 WorldScene과 BattleScene에 공통적 인 속성/메서드 만 사용하면됩니다.

나는 그것들이 두 개의 뚜렷이 다른 대상이라는 것을 알았지 만, 그들은 똑같은 것을 상속 받았다. 수동으로 어떤 유형의 제 3 유형으로 캐스팅하지 않고 이런 식으로 그룹화하는 영리한 방법이 있기를 바란다.

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) ... 

하지 않으면, 당신은 비를 사용할 수 있습니다 장면 <T>의 메서드와 속성이 그것을 허용하는 경우

+0

등의 목록을 선언 : 당신이 사용하는 데 필요한 기능을 선언 - 또는 인터페이스 -

나는 기본 클래스를 소개합니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

battlescene과 worlscene 모두의 상위 클래스 목록을 만들 수 없습니까? 부모는 일반적인 메소드를 포함합니다. battelscene과 worldscene은 모두 부모이기 때문에 목록에 저장하고 일반적인 방법을 호출 할 수 있습니다. –

답변

5

, 당신은 장면 < T는 > 구현하는 T > 밖으로 covariant generic interface의 iSCENE <를 정의 할 수 있습니다 - 일반 인터페이스 또는 비 - 일반 기본 클래스, 그러나 정의에 일반 구성원을 포함 할 수 없습니다 :

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> 내가 제목을 편집 한