Rozszerzanie funkcjonalności za pomocą dziedziczenia

0

Przejdę od razu do przykładu.
Załóżmy, że mam klasę "pistolet" i chciałbym dodać do niego latarkę, z uwagi na to, że nie chcę tworzyć klasy na 1000linijek, tworzę klasę "latarka". W tej klasie znajduje się funkcja "świeć". Czy zgodne ze standardami OOP jest dziedziczenie po klasie "latarka" w klasie "pistolet" i używanie w niej funkcji świeć? W jaki(lepszy) sposób mógłbym poszerzyć funkcjonalność klasy?

0

Dziedziczenie raczej nie. Pistolet nie jest rodzajem latarki, ani na odwrót.

Kompozycja raczej tak, czyli zawarcie latarki w obiekcie pistolet.
Pistolet z latarką powinien zawierać metodę świeć, która powiedzmy, że przy braku latarki wyrzuci wyjątek "Nie mam latarki".
Gdy latarka będzie to zostanie wywołana metoda z latarki - świeć.

Można ułożyć to znacznie lepiej, ale z kompozycją będzie to najłatwiejsze.

Staraj się w takich przypadkach wyobrażać sobie te obiekty.

0
leto napisał(a):

Przejdę od razu do przykładu.
Załóżmy, że mam klasę "pistolet" i chciałbym dodać do niego latarkę, z uwagi na to, że nie chcę tworzyć klasy na 1000linijek, tworzę klasę "latarka".

A potem będziesz chciał dodać tłumik i będziesz dziedziczyć z tłumika? A potem będziesz chciał dodać możliwość wystrzeliwania magicznych srebrnych kul, które zabijają wilkołaki i będziesz dziedziczyć z klasy SilverBullet?

W ten sposób dziedzicząc z każdej możliwej klasy wpadasz w pułapkę wielodziedziczenia (i masz klasę zabałaganioną wszelkimi możliwymi metodami).

Lepiej więc zrobić kompozycję. W różny sposób można to zaimplementować. Choćby robiąc tablicę z dodatkami, gdzie każdy element tablicy to odpowiedni dodatek.

Albo w przypadku srebrnych kul można opierać się na interfejsach, gdzie każda kula implementuje pewien interfejs ( nie wiem jak teraz, ale kiedyś w C++ się implementowało interfejsy za pomocą klas abstrakcyjnych).

Albo odejść od kodu i jak najwięcej spychać do parametrów. Może srebrna kula nie musi mieć żadnych specjalnych metod, a po prostu np. parametr "czy zabija wilkołaki" ustawiony na true.

Tak samo latarka też nie musiałaby mieć metod, a może też być pewną kompozycją i zawierać w sobie definicję wyglądu (np. plik *.png z bitmapą, nazwę modelu 3D itp.) i dodatek "światło" (bo samo świecenie powinno być wydzielone - wiele rzeczy może świecić).

0

Poczytaj o Entity Component System.

1 użytkowników online, w tym zalogowanych: 0, gości: 1