C#多态性再一次 - 虚拟属性

时间:2009-04-06 16:29:32

标签: c# polymorphism

这次我遇到虚拟字段问题。

我的游戏对象有核心课程。此类包含具有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

我尝试将模型定义为虚拟属性而不是字段,但这会失败,因为 派生属性必须与其基础类型相同。铸造是徒劳的,因为会有许多其他模型类型。如果我想从派生类中读取值而不是从base中读取值,我该怎么办?

2 个答案:

答案 0 :(得分:3)

听起来你的GenericGameObject需要是泛型类型,其中type参数派生自DefaultGameObjectModel

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

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

答案 1 :(得分:1)

您还可以创建一个IGameObjectModel接口,然后在每个对象模型类中实现它。然后,您的GameObject将具有IGameObjectModel的实例。