Je pense que ce serait cool que les trolls et les loups-garous héritent de leurs attributs de l'ennemi et en écrasent certains.
Malheureusement, cette approche du polymorphisme, populaire dans les années 90, s'est révélée être une mauvaise idée dans la pratique. Imaginez que vous ajoutez «loup» à la liste des ennemis - eh bien, il partage certains attributs avec le loup-garou, donc vous voudriez les consolider dans une classe de base partagée, par exemple. «WolfLike». Maintenant, vous ajoutez «Humain» à la liste ennemie, mais les loups-garous sont parfois des humains, ils partagent donc également des attributs, comme marcher sur 2 jambes, pouvoir parler, etc. Créez-vous une base commune «humanoïde» pour les humains et les loups-garous , et devez-vous alors arrêter les loups-garous dérivant de WolfLike? Ou multipliez-vous l'héritage des deux - dans ce cas, quel attribut a priorité lorsque quelque chose dans Humanoid entre en conflit avec quelque chose dans WolfLike?
Le problème est qu'essayer et modéliser le monde réel comme un arbre de classes est inefficace. Prenez 3 choses et vous pouvez probablement trouver 4 façons différentes de factoriser leur comportement en partagé et non partagé. C'est pourquoi beaucoup se sont plutôt tournés vers un modèle modulaire ou basé sur des composants, où un objet est composé de plusieurs objets plus petits qui composent l'ensemble, et les objets plus petits peuvent être échangés ou modifiés pour créer le comportement que vous souhaitez. Ici, vous ne pouvez avoir qu'une seule classe ennemie, et elle contient des sous-objets ou des composants pour la façon dont elle marche (par exemple. Bipède contre Quadrupède), ses méthodes d'attaque (par exemple, morsure, griffe, arme, poing), sa peau (verte pour les trolls, à fourrure pour les loups-garous et les loups), etc.
C'est toujours complètement orienté objet, mais la notion de ce qui est un objet utile est différente de ce qui était communément enseigné dans les manuels. Plutôt que d'avoir un grand arbre d'héritage de diverses classes abstraites et plusieurs classes concrètes aux extrémités de l'arbre, vous n'avez généralement qu'une seule classe concrète représentant un concept abstrait (par exemple, «ennemi») mais qui contient des classes plus concrètes représentant des concepts plus abstraits (p. ex. attaques, type de peau). Parfois, ces deuxièmes classes peuvent être mieux implémentées via 1 niveau d'héritage (par exemple une classe d'attaque de base et plusieurs classes dérivées pour des attaques spécifiques) mais l'arbre d'héritage profond a disparu.
Mais peut-être que les cours sont trop lourds pour être pratiques, je ne sais pas ...
Dans la plupart des langues modernes, les cours ne sont pas «lourds». Ils ne sont qu'une autre façon d'écrire du code, et ils enveloppent généralement l'approche procédurale que vous auriez écrite de toute façon, sauf avec une syntaxe plus facile. Mais par tous les moyens, n'écrivez pas une classe où une fonction fera l'affaire. Les classes ne sont pas intrinsèquement meilleures, seulement là où elles rendent le code plus facile à gérer ou à comprendre.