Szukaj

1944

Reklama

Chroń swoje dziecko

w Internecie
Reklama

za darmo ...

Kalendarz

Reklama

Jak odbierasz ...

Wygląd portalu
 

"Musicie od siebie wymagać, nawet jeśli inni by od Was nie wymagali..." JP2 [100%]

Reklama
Dziedziczenie - klasy potomne PDF Drukuj Email
Ocena użytkowników: / 5
SłabyŚwietny 
Instrukcje dodatkowe - Programowanie w języku JAVA
Wpisany przez Administrator   
Spis treści
Dziedziczenie - klasy potomne
Zadanie dla przypomnienia i utrwalenia
Co to są klasy potomne?
Dziedziczenie na prostym przykładzie
Czy dziedziczenie działa jak należy?
Ćwiczenia utrwalające
Rozwiązania zadań
Wszystkie strony

Dziedziczenie to jeden z fundamentów programowania obiektowego. Dzięki dziedziczeniu możemy wykorzystywać raz napisany kod klasy w innych, podobnych klasach. Możemy też tworzyć całe hierarchie klas o podobnej (dziedziczonej) strukturze.

Z tej lekcji nauczysz się:

  • na czym polega dziedziczenie
  • stosować dziedziczenie (tworzyć klasy potomne)

 


 

Zadanie dla przypomnienia i utrwalenia (nie jest wymagane do realizacji dalszej części instrukcji ale pomoże Ci utrwalić i poukładać informacje z poprzednich lekcji)

Zadanie 1: Napisz program, który:

  • definiuje klasę punkt2d o polach wspX oraz wspY.
  • Utwórz dwa konstruktory obiektów tej klasy:
    • jeden będzie ustawiał parametry wspX oraz wspY w oparciu o parametry przekazane przez użytkownika w argumentach konstruktora
    • drugi będzie ustawiał parametry wspX oraz wspY w oparciu o wartości pól wyciągnięte z obiektu tej samej klasy podanego jako parametr konstruktora
  • Utwórz metody:
    • ustawiania parametru wspX w oparciu o wartość przekazaną przez parametr metody
    • ustawiania parametru wspY w oparciu o wartość przekazaną przez parametr metody
    • ustawiania naraz parametrów wspX oraz wspY wykorzystując kolejno obie z w/w metod

Pytania kontrolne:

  • jak nazywa się metoda, która tworzy nowy obiekt danej klasy?
  • jak nazywa się taka sytuacje, kiedy występują dwie metody o takiej samej nazwie, ale o różnych parametrach?

Jeśli tych rzeczy nie masz jeszcze opanowanych, przypomnij sobie instrukcję z lekcji Przeciążanie metod i konstruktory

(podpowiedź: rozwiązanie zadania znajduje się na końcu instrukcji do tej lekcji)

 


 

Co to są klasy potomne?

Klasy potomne to klasy stworzone na wzór już istniejących klas. Klasa stworzona na wzór klasy bazowej nazywa się klasa potomną. Oczywiście klasę potomną można zmodyfikować, lecz nie tworzymy ją od zera tylko jakby korzystając z szablonu-wzorca, jaką jest klasa macierzysta. Aby to lepiej zrozumieć posłużę się przykładem: Załóżmy, że dwóch kolegów rozmawia o tym, jaki każdy z nich ma rower. Maciek mówi: mój rower ma koła 26", hamulce tarczowe, amortyzatory pneumatyczne, aluminiową ramę, osprzęt firmy xyz model zyx i jest koloru srebrnego. Na to mówi Krzysiek: mój jest w zasadzie taki sam, tylko ma mniejsze, 24" koła i jest koloru czerwonego. To, co tutaj zaszło można określić w ten sposób, że Maciek zdefiniował jakiś określony typ roweru a Krzysiek, na tej bazie opisał podobny rower (podobną klasę) z kilkoma modyfikacjami. Nie musiał jeszcze raz mówić o tym, co się powtarza (hamulce tarczowe, amortyzatory pneumatyczne i aluminiowa rama), tylko opisał swój rower na bazie opisu Maćka podając jedynie różnice. Analogicznie funkcjonuje dziedziczenie w programowaniu: tworzymy definicję nowej klasy w oparciu o już istniejącą, określając jedynie to, co jest inne lub nowe.

 


 

Aby to sprawdzić w praktyce posłużymy się prostym przykładem:

Zadanie 2:

Napisz program, w którym zdefiniujesz klasę o nazwie punkt2d o polach: wspX oraz wspY:

Teraz załóżmy, że chcemy stworzyć nową klasę o nazwie punkt3d, która będzie różniła się od klasy punkt2d tym, że będzie posiadała dodatkowe pole: wspZ.

Zadanie 3: Napisz program, w którym występują dwie klasy:

  • klasa punkt2d o polach wspX oraz wspY
  • klasa punkt3d o polach wspX, wspY oraz wspZ

 

Najprostszym (na pierwszy rzut oka) rozwiązaniem byłoby stworzenie całkiem nowej klasy i zdefiniowanie jej od początku:

Rozwiązanie polegało właściwie na przepisaniu większości kodu klasy punkt2d i dodaniu jednej linijki (11). O ile nie jest to aż tak uciążliwe w przypadku tak nieskomplikowanej klasy, o tyle przepisywanie całej definicji klasy wraz z metodami oraz konstruktorami klasy złożonej w wielu pól byłoby trudniejsze. (wyobraź sobie ile przepisywania byłoby potrzebne, aby analogiczną sytuacje (punkt2d => punkt3d zastosować do zadania 1).

Spróbuję teraz przedstawić inne, sprytniejsze rozwiązanie:

Zadanie 4: Napisz program, w którym występują dwie klasy:

  • klasa punkt2d o polach wspX oraz wspY
  • klasa punkt3d o polach wspX, wspY oraz wspZ, przy czym klasa punkt3d dziedziczy z klasy punkt2d

W linijce 8 wpisaliśmy początek definicji klasy punkt3d. Zapis extends punkt2d oznacza, że klasa ta tworzona jest na wzór klasy punkt2d, czyli dziedziczy z tej klasy. Innymi słowy, klasa punkt3d przejmuje (kopiuje) wszystkie właściwości (pola, metody, konstruktory itd.) z klasy punkt2d.

W linijce 9 dopisaliśmy jeszcze jedno pole: wspZ dlatego, że nie ma go w definicji klasy punkt2d.

 

Przypomnijmy kod dziedziczenia:

class nazwa_klasy extends klasa_macierzysta{

//dodatkowy kod klasy potomnej

}

 

Jak widać już w najprostszym przykładzie (klasa z 2 polami i niczym więcej) zyskujemy na:

  • czytelności kodu
  • miejscu
  • czasie potrzebnym do przepisywania/kopiowania jeszcze raz tego samego kodu w nowej klasie
  • potencjalnym spokoju, gdyż zmniejsza się ryzyko popełnienia literówek, błędów, "czeskich" błędów przy kopiowaniu kodu itd.

Zysk jest tym większy, im bardziej skomplikowane są klasy na których opiera się program.

 

 


 

Czy dziedziczenie działa jak należy?

Aby jednak sprawdzić, czy to wszystko działa jak należy (dziedziczenie) zmodyfikujmy powyższy przykład poprzez dodanie dwóch metod:

Zadanie 5: Zmodyfikuj powyższy program; dodaj metody:

  • ustawX, która zmienia wartość pola wspX na tą, która podana jest w parametrze metody
  • ustawY, która zmienia wartość pola wspY na tą, która podana jest w parametrze metody

Póki co usuń definicję klasy punkt3d.

 

Stwórzmy dodatkową klasę punkt3d, która dziedziczy z klasy punkt2d:

Zadanie 6: Zmodyfikuj powyższy program tak, aby dodać nową klasę punkt3d, która dziedziczy z klasy punkt 2d, oprócz tego posiada:

  • pole o nazwie wspZ;
  • metodę o nazwie ustawZ, która zmienia wartość pola wspZ na tą, która podana jest w parametrze metody

Jak widać klasa punkt3d dziedziczy z klasy punkt2d. Oprócz tego posiada własne, nowe pole wspZ oraz własną, nową metodę ustawZ. Sprawdźmy, czy to działa:

 

Zmodyfikuj program tak, aby wywołać wszystkie 3 metody dla obiektu klasy punkt3d: ustawX, ustawY, ustawZ.

 

Sprawdźmy, czy to działa. Uruchamiamy program:

Jak widać metody działają, czyli klasa punkt3d poprawnie odziedziczyła metody ustawX oraz ustawY z klasy punkt2d.

 

 


 

Ćwiczenia utrwalające, do samodzielnego wykonania.

Zadanie 6:

Napisz program, w którym:

  • zdefiniujesz klasę Uczeń o polach:
    • Imię
    • Nazwisko
    • Pesel
  • zdefiniujesz metody:
    • Ustaw_Imię, gdzie użytkownik będzie mógł podać imię
    • Ustaw_nazwisko, gdzie użytkownik będzie mógł podać nazwisko
    • Ustaw_pesel, gdzie użytkownik będzie mógł podać pesel

Zadanie 7: Zmodyfikuj powyższy program. Dodaj klasę UczeńSzkoły, która:

  • dziedziczy z klasy Uczeń
  • zawiera dodatkowe pole: Nazwa_szkoły
  • zawiera dodatkową metodę: Ustaw_szkołę, gdzie użytkownik może wstawić nazwę szkoły

 

Zadanie 8: Zmodyfikuj powyższy program. Dodaj klasę UczeńKlasy, która:

  • dziedziczy z klasy UczeńSzkoły
  • zawiera dodatkowe pole: klasa
  • zawiera dodatkową metodę: Ustaw_klasę, gdzie użytkownik może wstawić numer klasy

Zadanie 9: Zmodyfikuj powyższy program.

  • utwórz obiekt klasy UczeńKlasy
  • wprowadź kod, który korzystając z odpowiednich metod pozwoli użytkownikowi definiować wartości poszczególnych pól

Zadanie 10: Zmodyfikuj powyższy program. Zastanów się w jaki sposób można by ułatwić/uprościć powyższy program, aby kod, który dodaliśmy w Zadaniu 9 nie musiał być za każdym razem wpisywany, kiedy zmieniamy wartość danego pola?

 

Powodzenia!


 

Rozwiązania zadań:

Zadanie 1:

Zadanie 6:

Zadanie 7:

Zadanie 8:

Zadanie 9:

Zadanie 10:

Kod metody:

Kod wywołania metody (zamiast poprzedniego):

Czyli przenosimy ten kod do ciała metody (przeciążonej) i w ten sposób piszemy go tylko raz w całym programie.