Cette fois, j'ai un problème avec les champs virtuels.Polymorphisme C# encore une fois - propriétés virtuelles
J'ai classe de base pour mes objets de jeu. Cette classe contient un champ avec un objet de classe Model. L'objet du modèle contient des valeurs telles que la position, etc.
Maintenant, en dessin, j'ai besoin de lire la position de chaque objet de son modèle. Le problème commence quand au lieu de classe de modèle par défaut j'utilise dérivé. Exemple:
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
J'ai essayé de modèle défini comme la propriété virtuelle au lieu de champ, mais cela échoue parce que propriétés dérivées doivent être de même type que leur base. Casting est futile car il y aura beaucoup d'autres types de modèles. Que puis-je faire si je veux lire une valeur de la classe dérivée, pas de la base?
Cela semble être une bonne réponse à ma question, je n'ai qu'un autre problème: le type d'objet de jeu nécessite le type exact de modèle, et maintenant je peux utiliser n'importe quel type de création d'objet. En outre, MissileModel pourrait contenir des méthodes supplémentaires qui ne seraient pas visibles dans Missile sans lancer:/ –
Je pense que vous avez mal compris. Vous pourriez toujours avoir un type de missile, qui dériverait de GenericGameObject. Ensuite, vous pourrez toujours voir les méthodes MissileModel car le modèle est fortement typé. –