繁体   English   中英

C#多态再次-虚拟属性

[英]C# polymorphism once again - virtual properties

这次我对虚拟字段有疑问。

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

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

听起来您的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; }
     }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM