이번에는 가상 필드에 문제가 있습니다.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; }
}
}
게임 객체의 유형은 정확한 유형의 모델을 필요로하며, 이제는 객체를 생성하는 동안 원하는 모든 유형을 사용할 수 있습니다. 또한 MissileModel에는 캐스팅하지 않고 Missile에서 볼 수없는 추가 메서드가 포함될 수 있습니다./ –
오해했습니다. GenericGameObject에서 파생 된 미사일 유형을 사용할 수 있습니다. 모델이 강하게 입력 되었기 때문에 여전히 MissileModel 메서드를 볼 수 있습니다. –