dziedziczenie vs deklaracja obiektu

2013-04-29 14:28
Tojax
0

Hej, mam pytanko odnośnie dziedziczenia.
Czy może mi ktoś wskazać różnicę między dziedziczeniem a zadeklarowaniem obiektu rodzica w danej klasie poza następującymi:

  1. nie mamy dostępu do bloku protected
  2. do obiektu odwołujemy się przez dodatkową ścieżkę (.nazwa_klasy)
  3. nie możemy korzystać z funkcji virtualnych

chodzi o porównanie następujących zapisów:

class klasa_bazowa{
//...
}
class klasa_dziedziczona: public klasa_bazowa{
//rozbudowujemy klasę bazową
}

class pseudo_dziedziczenie{
klasa_bazowa obiekt;
//tworzymy nową klasę korzystającą z obiektu klasy bazowej
}

int main(){
klasa_dziedziczona obiekt1;
pseudo_dziedziczenie obiekt2;
obiekt1.jakas_funkcja();
obiekt2.obiekt.jakas_funkcja();
}

Co jeszcze daje dziedziczenie?

Pozostało 580 znaków

2013-04-29 14:37
0
  1. Przy dziedziczeniu dziedziczysz również większość przeciążonych operatorów.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-04-29 14:39
0
  1. Polimorfizm - możesz przypisać do wskaźnika obiekt dziecka wnuka prawnuka praprawnuka.....
    Korzyści tutaj płyną przy zastosowaniu funkcji wirtualnych o których wspomniałeś
edytowany 1x, ostatnio: Sarrus, 2013-04-29 14:40

Pozostało 580 znaków

2013-04-29 14:47
0

Umozliwia OCP w dosc prosty i logiczny sposob.

Pozostało 580 znaków

2013-04-29 14:51
0

Nie należy jednak przeceniać dziedziczenia, czasami lepiej jest zadeklarować pole potrzebnego typu, niż po tym typie dziedziczyć…

Pozostało 580 znaków

2013-04-29 15:39
0

@Azarien prawdę mówi. Przykład:
Wyobraźmy sobie lampę z kloszem (nieprzezroczystym) . Po zapaleniu wyraźnie świeci. Mówi się, że zapalamy/włączamy lampę, a nie mówimy włączam żarówkę w lampie. Jednakże lampa nie jest typem żarówki (relacja is-a). Posiada odmienne własności i zawiera żarówkę (relacja has-a). Mamy tutaj enkapsulację, bo lampa dostarcza prądu do żarówki i filtruje jej światło przez klosz. I obiekt zawierany może zostać wymieniony, no bo kto o zdrowych zmysłach wyrzuca lampę gdy się przepali żarówka :P

Według mnie tutaj nie ma co porównywać, bo to są relacje o nieco innym zastosowaniu. W przeciwieństwie jednak do życia codziennego w programowaniu powstają byty czysto abstrakcyjne i rozpoznanie prawidłowej relacji rzeczywiście może przyprawić o ból głowy.

edytowany 1x, ostatnio: Sarrus, 2013-04-29 15:40
Wszystko jest proste, jak nie potrzebujesz ewidentnego polimorfizmu - to użyj zawieranie i nie ma co rozpoznawać. - _13th_Dragon 2013-04-29 15:45

Pozostało 580 znaków

2013-04-29 15:59
0

Jeszcze istnieje coś takiego jak delagacja czyli relacja pomiędzy dziedziczeniem a kompozycją:

class klasa_bazowa{
public:
void fun1(void) {}
void fun2(void) {}
};
class pseudo_dziedziczenie{
klasa_bazowa obiekt;
//tworzymy nową klasę korzystającą z obiektu klasy bazowej
public:
void fun1(void) {obiekt.fun1();}
void fun2(void) {obiekt.fun2();}
};

Zauważ ,że dzięki temu możemy wybiórczo udostępniać metody danego obiektu i nie dziedziczy się całego "interfejsu obiektu klasy bazowej". Dlatego jest to też propozycja godna rozważenia przy projektowaniu programu,ale jak już mówił azarien że można przekombinować program używając niepotrzebnie dziedziczenia


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
edytowany 1x, ostatnio: robcio, 2013-04-29 16:00

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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