Cette fois, j'ai un problème avec les champs virtuels.Question de polymorphisme C# encore une fois - champs prioritaires?
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 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
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?
J'ai déjà posé cette question mais la réponse n'a apporté aucune solution. Explaination:
à utiliser l'interface IGameObjectModel
concept est bon, mais je dois respecter les champs. Les interfaces ne peuvent pas définir de champs, je dois donc définir une propriété. Mais alors je ne peux pas faire IGameObjectModel.Position.X = 10 parce que Position n'est pas un champ.
pour faire GenericGameObject un type générique tel que GenericGameObject et des missiles un type dérivé de GenericGameObject Je ne pouvais alors lancer un missile à GenericGameObject et généralement stocker les objets sur la même liste. Bien sûr, je pourrais faire le type de base principal dont ces deux pourraient hériter, mais alors je n'aurais pas accès au champ Modèle.
pour faire du modèle une propriété au lieu du champ. Il est impossible de changer le type de propriété dans la classe dérivée.
Que pouvais-je faire?
"Que puis-je faire?" - Vous pouvez commencer par éditer votre question précédente au lieu d'en poser une nouvelle. –
Hm, tu as raison, je n'y ai pas réfléchi, désolé. Il semble impossible de supprimer la question pour un utilisateur non enregistré mais sûrement la prochaine fois que je modifierais celui existant. Merci :) –
Il n'y a pas de "champs virtuels". Seules les propriétés ou méthodes peuvent être virtuelles. – mmmmmmmm