ŁF napisał(a)
plobpo napisał(a)
spotkalem sie z opinia, ze w tej sytuacji (gdy jedynie rozszerzam funkcjonalnosc nie nadpisujac zadnych odziedziczonych elementow) lepiej byloby w nowych klasach dodac atrybut typu klasy bazowej i za jego pomoca korzystac z jej funkconalnosci.
jakiś czas temu wyczytałem w książce nt. wzorców projektowych dość dobre wytłumaczenie co w takiej sytuacji zrobić. jeśli
- klasa "potomna" ma uzupełniać funkcjonalność klasy rodzica,
- rodzic ma mało metod i/lub znasz dobrze wszystkie i i jesteś pewien, że wywołanie dowolnej odziedziczonej (a nienadpisanej) metody nic nie zepsuje w klasie dziecka,
- świadomie nie chcesz zawężać funkcjonalności rodzica (np. przez ukrycie części/większości metod),
to użyj dziedziczenia.
jeśli masz hipotetyczną sytuację: masz klasę Graphics pozwalającą rysować punkty. robisz klasę Circle, która ma rysować okręgi. jeśli zastosujesz dziedziczenie, to obiekt Circle będzie pozwalać także na rysowanie punktów i inne bóg-wie-jakie rzeczy, na które pozwala klasa Graphics. logiczne, że tego nie chcesz, więc w tym przypadku nie robisz dziedziczenia, tylko enkapsulację/agregację.
@j_s_r_n: nie znam niuansów c++, ale każdy obiekt z metodami wirtualnymi ma tablicę vmt; więcej obiektów, mniej dziedziczenia, więcej tablic; mniej obiektów, więcej dziedziczenia, dłuższe tablice. imho różnice w użyciu pamięci i szybkości kodu będą nieznaczne, zresztą co za problem to przetestować (i opublikować wyniki pod postacią artykułu)?
Opis rzeczywiscie sensowny, dziekuje.
Troche tylko obawiam sie niektorych wzorcow projektowych, jesli wezmiemy pod uwage efektywne wykorzystanie pamieci. Wybacz ze wracam do tego jak maniak, ale systemy wbudowane rzadza sie swoimi prawami. Spotkalem kiedys niesamowicie uzyteczny wzorzec nazwijmy go "Inteligentnym wskaznikiem", ktory (w wielkim uproszczeniu) opakowywal kazdy wskaznik w obiekt, ktory trzymal adres jako atrybut i zabezpieczal np. przed czytaniem z pustego adresu pamieci. Sek w tym, ze opakowujac wskaznik obiektem zuzywalismy pamiec i kiszka.
Wydaj mi sie ze rzeczywiscie najlepszym rozwiazaniem byloby sprawdzenie tego doswiadczalnie i jak znajde chwile wolnego czasu (tak pewnie kolo emerytury) sprawdze jak to wyglada w rzeczywistosci. Zastanawiam sie czy system operacyjny na ktorym bede to testowal ma znaczenie... wydaje mi sie ze nie, ale zawsze moge sprobwac na kilku roznych.