这次我遇到了虚拟字段的问题。
我的游戏对象有核心类。此类包含带有模型类对象的字段。模型的对象包含位置等值。
现在 - 在绘图时我需要从它的模型中读取每个对象的位置。当我使用派生而不是默认模型类时,问题就开始了。例子:
abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); }
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); }
class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; }
class MissileModel : DefaultGameObjectModel { }
Missile m = new Missile();
m.Model.Position.X = 10;
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0
我试图将模型定义为虚拟属性而不是字段,但这失败了,因为派生属性必须与它们的基础类型相同。铸造是徒劳的,因为会有许多其他模型类型。如果我想从派生类而不是基类中读取值,我该怎么办?
我已经问过这个问题,但答案没有带来任何解决方案。解释:
使用接口 IGameObjectModel
概念很好,但我必须强制执行字段。接口不能定义字段,所以我必须定义属性。但是我不能做 IGameObjectModel.Position.X=10 因为 Position 不是一个字段。
为了使 GenericGameObject 成为泛型类型,例如 GenericGameObject 和 Missile 派生自 GenericGameObject 的类型, 我无法将导弹投射到 GenericGameObject 并通常将这些对象存储在同一个列表中。当然,我可以制作这两个可以继承的主要基本类型,但是我将无法访问 Model 字段。
使模型成为属性而不是字段。 无法更改派生类中的属性类型。
我能做什么?