Codul real este foarte diferit și pe un subiect cu totul diferit, dar am simțit că acest mic exemplu ar putea fi mai bun, deoarece problema mea este înțelegerea conceptelor cheie pentru scenarii complexe de moștenire (și nu domeniul meu specific).

pentru

Să considerăm că avem o clasă de entitate de bază:

Aceasta este o clasă de bază moștenită de alte entități concrete și atacul () trebuie să fie abstract, deoarece fiecare entitate ar trebui să pună în aplicare propriul stil de metodă de atac.

Acum am putea implementa câteva entități:

Acest lucru funcționează bine. Cu toate acestea, mă străduiesc să găsesc o soluție bună (în stil DRY) pentru implementarea „abilităților” și a altor lucruri.

De exemplu, dacă Orc și Human nu numai că ar trebui să se miște, ci și să poată sări, ar fi interesant să ai ceva de genul:

Aceasta introduce două probleme. (1) avem nevoie de acces la auto.poziție în CanJump, deci trebuie să moștenim de la Entitate?! Dacă facem acest lucru, trebuie să implementăm metoda abstractă attack () în clasa CanJump. Acest lucru nu are sens, deoarece CanJump ar trebui să ofere entităților abilitatea unui nou tip de mișcare. (2) în viitor am putea dori să implementăm, de exemplu, un decorator care verifică dacă starea unei entități este Condition.DEAD înainte de a executa move (), attack (),. Acest lucru înseamnă, de asemenea, că CanJump are nevoie de acces la sine.condiție .

Care ar fi o soluție curată pentru acest tip de probleme?