Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 2
  • 69

Witam.

Zastanawiam się na pewnym zagadnieniem i czy jest rozwiązanie typu  win-win.

Otóż wykorzystując mechanizm dziedziczenia możemy zaoszczędzić dużo pracy, jednak równocześnie stwarza się pewne niebezpieczeństwo polegające na tym, że   modyfikując nadklasy wpływamy także na podklasy (co nie zawsze może być zamierzone).

Rafał_Kędzierski
  • Zapytał
  • @ Rafał_Kędzierski | 16.02.2016
    • lider
    • laureat
    • 39
    • 6
    • 46

Odpowiedź (1)

  • 6

Wydaje mi się, że problem wynika z niepełnego zrozumienia idei dziedziczenia.

Celem dziedziczenia nie jest uproszczenie kodu - to jest efekt uboczny. Definiując klasę potomną faktycznie możemy wyspecyfikować tylko różnice w stosunku do klasy bazowej (co upraszcza kod), ale jednocześnie przejmujemy zachowanie klasy bazowej.

W ten sposób możemy zamodelować podobieństwo klas. Np. stwierdzenie: prostokąt jest czworokątem może oznaczać, że klasa Prostokąt dziedziczy (rozszerza) klasę Czworokąt. Nieprzypadkowo relację dziedziczenia określa się terminem IS_A. Oznacza to, że obiekt potomny możemy traktować jak obiekt bazowy (prostokąt jest czworokątem).

Przejęcie zachowania oznacza, że w stosunku do obiektu potomnego możemy zastosować metody z klasy bazowej (te które widzimy). W klasie potomnej możemy je:

  • wykonać bez żadnej modyfikacji (wystarczy, że je dziedziczymy),
  • możemy zmodyfikować ich zachowanie bazując na zachowaniu oryginalnym (wykorzystujemy referencję super),
  • lub też całkowicie zmienić zachowanie bez odwoływania się do kodu metody wyjściowej. W tym ostatnim przypadku mamy w pewnym stopniu niezależność - modyfikacja kodu metody bazowej nie wpłynie na kod metody potomnej.

Relacja dziedziczenia jest relacją ukierunkowaną - działa w jedną stronę (relacja rodzic - dziecko). Dziedzicząc godzimy się na przejęcie zachowania klasy wyjściowej (nadklasy). Zmiany w klasie bazowej będą odzwierciedlone w klasie potomnej, bo dzięki polimorfizmowi możemy do obiektów potomnych odnosić się poprzez referencję typu bazowego (to właśnie oznacza relacja IS_A). W drugą stronę to nie działa. Klasa potomna nie może wpływać na zachowanie klasy bazowej

  • Odpowiedział
  • @ | 17.02.2016
  • TRENER MODERATOR ALTKOM AKADEMII