Dziedziczenie publiczne kontenera czy kontener jako składowa

0

Witam.
Ostatnimi czasy czerpię wiedzę z książki "C++ i QT - Wprowadzenie do wzorców projektowych". I tam zaprezentowano dziedziczenie publiczne QList<> :

class CardDeck : public QList<Card> {};

class Card {}; // prosta klasa karty do gry

Dzięki takiemu rozwiązaniu klasa CardDeck jest kontenerem QList<Card> i dziedziczy po nim wszystkie metody. CardDeck zawiera też swoje funkcje publiczne (konstruktor, tworzenie talii). Jednakże takie dziedziczenie jest dla mnie trochę dziwne i niezrozumiałe. Czy nie lepiej byłoby stworzyć zmienną składową QList<Card> zamiast używać dziedziczenia? Czy kod takiej funkcji nie byłby czytelniejszy i prostszy? Druga wada, jaką zauważam, to to, że kod kliencki może odwoływać się bezpośrednio do metod kontenera QList i zmieniać dowolnie wartości. Tak chyba być nie powinno.

Jakie są zalety takiego dziedziczenia? Czy może lepiej używać zmiennych?

1

Generalnie masz rację i nie jest to specjalnie dobra sprawa, ale są sytuacje kiedy ma to sens. Wyobraź sobie że chcesz użyć w istniejącym kodzie swojej własnej kolekcji, bardzo podobnej do juz istniejącej, ale lekko zmodyfikowanej. Istniejacy kod opiera sie o jakiśtam interfejs np. List<T>. Masz dwie opcje ->

  1. Zrobić składową w swojej klasie, zaimplementować interfejs, delegować wszystkie "standardowe" metody do tej składowej listy a tam gdzie potrzebujesz wprowadzić te swoje modyfikacje. W efekcie masz np. własne 2 linijki i 100 linijek z delegowaniem metody.
  2. Odziedziczyć po tym standardowym kontenerze i nadpisać tylko tam gdzie potrzebujesz. W efekcie masz niemalże pustą klasę ze zmienioną jakąś jedną metodą.

Czy opcja nr 2 nadal wydaje się glupia? ;)

0

Tak, wtedy opcja nr 2 ma sens. Ale wtedy opcja dodawania/usuwania/zmieniania elementów w kolekcji jest uzasadniona. A tutaj klasa jest "zamknięta", inicjuje równo 52 karty. I niezbyt pożądane jest zmienianie ręcznie ich liczby lub inne operacje poza tymi udostępnionymi przez samą klasę.

Dzięki za odpowiedź i rozwianie moich wątpliwości. :)

0

To w takim razie ktoś to źle zaprojektował. Niestety wielu ludzi ma klapki na oczach i nawet nie pomyśli o delegacji zamiast o dziedziczeniu ;]

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