Myślę, że fajnie byłoby, gdyby zarówno troll, jak i wilkołak odziedziczyli swoje atrybuty od wroga i nadpisali niektóre z nich.
Niestety to popularne w latach 90. podejście do polimorfizmu okazało się w praktyce złym pomysłem. Wyobraź sobie, że dodajesz „wilka” do listy wrogów - cóż, dzieli on pewne atrybuty z wilkołakiem, więc chciałbyś skonsolidować je we wspólnej klasie bazowej, np. „WolfLike”. Teraz dodajesz „Człowieka” do listy wrogów, ale wilkołaki są czasami ludźmi, więc dzielą też atrybuty, takie jak chodzenie na 2 nogach, zdolność do mówienia itp. Czy tworzysz wspólną „Humanoidalną” bazę dla ludzi i wilkołaków i czy musicie przestać wilkołaki wywodzące się z WolfLike? Czy też mnożymy dziedziczenie po obu - w którym przypadku, który atrybut ma pierwszeństwo, gdy coś w Humanoid koliduje z czymś w WolfLike?
Problem polega na tym, że próba modelowania świata rzeczywistego jako drzewa klas jest nieskuteczna. Weź 3 dowolne rzeczy, a prawdopodobnie znajdziesz 4 różne sposoby na podzielenie ich zachowania na współdzielone i nieudostępnione. Z tego powodu wiele osób zdecydowało się na model modułowy lub oparty na komponentach, w którym obiekt składa się z kilku mniejszych obiektów, które składają się na całość, a mniejsze obiekty można zamieniać lub zmieniać w celu uzyskania pożądanego zachowania. Tutaj możesz mieć tylko 1 klasę wroga, która zawiera podobiekty lub komponenty do tego, jak idzie (np. Bipedal vs. Quadrupedal), jego metody ataku (np. Ugryzienie, pazur, broń, pięść), jego skórę (zielony dla trolli, futrzany dla wilkołaków i wilków) itp.
Jest to nadal całkowicie zorientowane obiektowo, ale pojęcie tego, co jest użytecznym przedmiotem, różni się od tego, co zwykle nauczano w podręcznikach. Zamiast dużego drzewa dziedziczenia różnych klas abstrakcyjnych i kilku konkretnych klas na końcach drzewa, zazwyczaj masz tylko 1 konkretną klasę reprezentującą abstrakcyjne pojęcie (np. „Wróg”), ale która zawiera bardziej konkretne klasy reprezentujące bardziej abstrakcyjne pojęcia (np. ataki, rodzaj skóry). Czasami te drugie klasy można najlepiej wdrożyć poprzez 1 poziom dziedziczenia (np. Podstawowa klasa Ataku i kilka klas pochodnych dla określonych ataków), ale drzewo głębokiego dziedziczenia zniknęło.
Ale może zajęcia są zbyt ciężkie, aby były praktyczne, nie wiem ...
W większości współczesnych języków lekcje nie są „ciężkie”. Są po prostu innym sposobem pisania kodu i zwykle zawierają podejście proceduralne, które i tak napisalibyście, z wyjątkiem łatwiejszej składni. Ale na pewno nie pisz klasy, w której będzie działać funkcja. Klasy nie są z natury lepsze, tylko tam, gdzie ułatwiają zarządzanie lub zrozumienie kodu.