2009-04-06 2 views
0

이번에는 가상 필드에 문제가 있습니다.C# 다형성 - 가상 속성

내 게임 개체에 핵심 클래스가 있습니다. 이 클래스에는 Model 클래스 객체가있는 필드가 들어 있습니다. 모델의 객체에는 위치 등의 값이 포함됩니다.

이제 - 드로잉 중에 각 객체의 위치를 ​​모델에서 읽을 필요가 있습니다. 문제는 파생 된 기본 모델 클래스 대신 사용할 때 시작됩니다. 예 :

abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); } 
class Plane : GenericGameObject { public void shoot(Missile m){ m.Model.Position.X = 10; } } 
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); } 

class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; } 
class MissileModel : DefaultGameObjectModel { } 

Plane p = new Plane(); 
Missile m = new Missile(); 
p.shoot(m); 
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0 

내가 대신 필드의 가상 속성으로 정의 된 모델을 만들기 위해 노력했지만 파생 된 속성을 자신의 기지와 같은 형식이어야하기 때문에이 오류가 발생합니다. 다른 많은 모델 유형이 있기 때문에 캐스팅은 쓸모 없습니다. 기본 클래스가 아닌 파생 클래스에서 값을 읽으려면 어떻게해야합니까?

abstract class GenericGameObject<TModel> 
    where TModel : DefaultGameObjectModel 
{ 
    private TModel model; 

    // Or whatever 
    public TModel Model 
    { 
     get { return model; } 
     protected set { model = value; } 
    } 
} 

답변

3

는 소리가 난다. GameObject는 IGameObjectModel 인스턴스를 갖습니다.

+0

게임 객체의 유형은 정확한 유형의 모델을 필요로하며, 이제는 객체를 생성하는 동안 원하는 모든 유형을 사용할 수 있습니다. 또한 MissileModel에는 캐스팅하지 않고 Missile에서 볼 수없는 추가 메서드가 포함될 수 있습니다./ –

+0

오해했습니다. GenericGameObject 에서 파생 된 미사일 유형을 사용할 수 있습니다. 모델이 강하게 입력 되었기 때문에 여전히 MissileModel 메서드를 볼 수 있습니다. –

1

당신은 또한 IGameObjectModel 인터페이스를 생성 한 다음 개체 모델의 각 클래스에서 구현할 수 : 당신의 GenericGameObject 요구 유형 매개 변수가 DefaultGameObjectModel에서 파생되는 일반적인 유형으로 같은

+0

나는 아이디어를 원하지만 기본 클래스에는 모든 파생 클래스 (이동, 회전 등)에서 공유되는 코드가 포함됩니다. 이 경우 DRY 규칙을 어길 수 있습니다. –

+0

기본 클래스는 여전히 DefaultGameObjectModel 클래스에서 상속받을 수 있으며 자체 구현 인터페이스를 가질 수 있습니다. –

+0

그런 경우에 당신은 물론 맞습니다. 나는 그것도 똑같이 Base 클래스와 Interface를 가지는 것이 이상 할 것이라고 생각한다. :) 그런 식으로 해결 될 수있다. –