Creo que sería genial que tanto el troll como el hombre lobo heredaran sus atributos del enemigo y sobrescribieran algunos de ellos.
Lamentablemente, este enfoque del polimorfismo, popular en los años 90, ha demostrado ser una mala idea en la práctica. Imagina que agregas 'lobo' a la lista de enemigos; bueno, comparte algunos atributos con el hombre lobo, por lo que querrás consolidarlos en una clase base compartida, por ejemplo. 'WolfLike'. Ahora agregas 'Humano' a la lista de enemigos, pero los hombres lobo a veces son humanos, por lo que también comparten atributos, como caminar sobre dos patas, poder hablar, etc. ¿Creas una base común 'Humanoide' para humanos y hombres lobo? , ¿y luego tienes que detener a los hombres lobo derivados de WolfLike? ¿O multiplica la herencia de ambos, en cuyo caso, qué atributo tiene prioridad cuando algo en Humanoid choca con algo en WolfLike?
El problema es que probar y modelar el mundo real como un árbol de clases es ineficaz. Tome 3 cosas y probablemente pueda encontrar 4 formas diferentes de factorizar su comportamiento en compartido y no compartido. Esta es la razón por la que muchos han optado por un modelo modular o basado en componentes, en el que un objeto se compone de varios objetos más pequeños que forman el todo, y los objetos más pequeños se pueden intercambiar o cambiar para crear el comportamiento que desea. Aquí puede tener solo 1 clase de Enemigo, y contiene subobjetos o componentes de cómo camina (por ejemplo, Bípedo contra Cuadrúpedo), sus métodos de ataque (por ejemplo, mordedura, garra, arma, puño), su piel (verde para trolls, peludos para hombres lobo y lobos), etc.
Esto todavía está completamente orientado a objetos, pero la noción de lo que es un objeto útil es diferente de lo que solía enseñarse en los libros de texto. En lugar de tener un gran árbol de herencia de varias clases abstractas y varias clases concretas en las puntas del árbol, generalmente tiene solo 1 clase concreta que representa un concepto abstracto (por ejemplo, 'enemigo') pero que contiene más clases concretas que representan conceptos más abstractos (por ejemplo, ataques, tipo de piel). A veces, estas segundas clases se pueden implementar mejor a través de 1 nivel de herencia (por ejemplo, una clase de ataque base y varias clases derivadas para ataques específicos), pero el árbol de herencia profunda se ha ido.
Pero tal vez las clases son demasiado pesadas para ser prácticas, no sé ...
En la mayoría de los idiomas modernos, las clases no son "pesadas". Son solo otra forma de escribir código y, por lo general, simplemente envuelven el enfoque de procedimiento que habría escrito de todos modos, excepto con una sintaxis más fácil. Pero, por supuesto, no escriba una clase donde una función servirá. Las clases no son intrínsecamente mejores, solo cuando hacen que el código sea más fácil de administrar o comprender.