Penso che sarebbe bello che sia il troll che il lupo mannaro abbiano ereditato i suoi attributi dal nemico e ne abbiano sovrascritto alcuni.
Purtroppo questo approccio al polimorfismo, popolare negli anni '90, si è dimostrato in pratica una cattiva idea. Immagina di aggiungere "lupo" all'elenco dei nemici - beh, condivide alcuni attributi con il lupo mannaro, quindi vorresti consolidarli in una classe base condivisa, ad es. 'WolfLike'. Ora aggiungi "Umano" all'elenco dei nemici, ma a volte i lupi mannari sono umani, quindi condividono anche attributi, come camminare su 2 gambe, essere in grado di parlare, ecc. Crei una base comune "umanoide" per umani e lupi mannari , e poi devi smettere di lupi mannari derivanti da WolfLike? O moltiplichi l'ereditarietà di entrambi - nel qual caso, quale attributo ha la precedenza quando qualcosa in Humanoid si scontra con qualcosa in WolfLike?
Il problema è che provare e modellare il mondo reale come un albero di classi è inefficace. Prendi 3 cose e probabilmente puoi trovare 4 modi diversi per fattorizzare il loro comportamento in condiviso e non condiviso. Questo è il motivo per cui molti si sono invece rivolti a un modello modulare o basato su componenti, in cui un oggetto è composto da diversi oggetti più piccoli che compongono il tutto e gli oggetti più piccoli possono essere scambiati o modificati per compensare il comportamento desiderato. Qui potresti avere solo 1 classe di nemici, e contiene oggetti secondari o componenti per come cammina (es. Bipede contro quadrupede), i suoi metodi di attacco (es. Morso, artiglio, arma, pugno), la sua pelle (verde per troll, peloso per lupi mannari e lupi), ecc.
Questo è ancora completamente orientato agli oggetti, ma la nozione di cosa sia un oggetto utile è diversa da quella che veniva comunemente insegnata nei libri di testo. Invece di avere un grande albero ereditario di varie classi astratte e diverse classi concrete sulle punte dell'albero, in genere hai solo una classe concreta che rappresenta un concetto astratto (ad esempio "nemico") ma che contiene più classi concrete che rappresentano concetti più astratti (es. attacchi, tipo di pelle). A volte queste seconde classi possono essere implementate al meglio tramite 1 livello di ereditarietà (ad es. Una classe di attacco base e diverse classi derivate per attacchi specifici) ma l'albero delle eredità profonde è sparito.
Ma forse le lezioni sono troppo pesanti per essere pratiche, non lo so ...
Nella maggior parte delle lingue moderne, le lezioni non sono "pesanti". Sono solo un altro modo di scrivere codice e di solito avvolgono semplicemente l'approccio procedurale che avresti scritto comunque, tranne che con una sintassi più semplice. Ma sicuramente, non scrivere una classe in cui una funzione farà. Le classi non sono intrinsecamente migliori, ma solo dove semplificano la gestione o la comprensione del codice.