Dziedziczenie i interfejsy

Podobne dokumenty
Mechanizm dziedziczenia

Mechanizm dziedziczenia

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wprowadzenie do obiektowości

Wprowadzenie do obiektowości

Interfejsy i klasy wewnętrzne

Dziedziczenie. Tomasz Borzyszkowski

Dziedziczenie. dr Jarosław Skaruz

TEMAT : KLASY DZIEDZICZENIE

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Klasy abstrakcyjne i interfejsy

Dokumentacja do API Javy.

Klasy abstrakcyjne, interfejsy i polimorfizm

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Klasy i obiekty. Programowanie zorientowane obiektowo. Case study: Filmoteka Case study: Klasa Akademik

Programowanie obiektowe

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Aplikacje w środowisku Java

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie obiektowe

Dziedziczenie. Zadanie 1

Programowanie obiektowe

Wykład 6: Dziedziczenie

Enkapsulacja, dziedziczenie, polimorfizm

Kompozycja i dziedziczenie klas

Technologie i usługi internetowe cz. 2

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie obiektowe w języku

Polimorfizm. dr Jarosław Skaruz

Kurs WWW. Paweł Rajba.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

.NET Klasy, obiekty. ciąg dalszy

Dziedziczenie jednobazowe, poliformizm

PHP 5 język obiektowy

Programowanie obiektowe - 1.

Programowanie obiektowe i zdarzeniowe

1 Dziedziczenie. 1.1 Koncepcja dziedziczenia. Ćwiczenie 3

Rozdział 4 KLASY, OBIEKTY, METODY

Wykład 8: klasy cz. 4

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Projektowanie obiektowe. Roman Simiński Polimorfizm

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Język Java część 2 (przykładowa aplikacja)

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

PARADYGMATY PROGRAMOWANIA Wykład 4

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Typy sparametryzowane

Język Java część 2 (przykładowa aplikacja)

Obiektowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2012

Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Podstawy Języka Java

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie w Internecie. Java

Programowanie obiektowe

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Programowanie obiektowe

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Definiowanie własnych klas

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Typy klasowe (klasy) 1. Programowanie obiektowe. 2. Założenia paradygmatu obiektowego:

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Aplikacje w środowisku Java

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania

Deklaracja i definicja metod, zwracanie wartości z metod, przekazywania parametrów do metod

10. Programowanie obiektowe w PHP5

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie 2. Język C++. Wykład 9.

Wykład 9: Polimorfizm i klasy wirtualne

Programowanie i projektowanie obiektowe

Podstawy programowania III

Monika Wrzosek (IM UG) Programowanie obiektowe 21 / 25

Aplikacje w Javie wykład 5 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Interfejsy

Programowanie obiektowe

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Zaawansowane programowanie w C++ (PCP)

Dziedziczenie Dana jest klasa Punkt w pliku o nazwie Punkt.java:

Instrukcja do pracowni specjalistycznej z przedmiotu. Obiektowe programowanie aplikacji

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Języki i techniki programowania Ćwiczenia 2

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Programowanie w Javie wykład 8 Interfejsy

Java Język programowania

Transkrypt:

Dziedziczenie i interfejsy

Wyróżnia się dwa sposoby ponownego wykorzystania klas: Kompozycję oznacza, że obiekt jest zawarty w innym obiekcie i jest reprezentowana przez relację całość-część. Przykładowo lampa zawiera żarówkę (i nie bardzo sobie można wyobrazić lampę bez żarówki) Dziedziczenie oznacza przejmowanie własności innego obiektu i poddanie ich wyspecjalizowaniu. Jest reprezentowane przez relację generalizacji-specjalizacji np. Paprotka jest specjalizacją Rośliny. Technika dziedziczenia umożliwia tworzenie nowych klas na bazie klas już istniejących. Klasa, która dziedziczy po innej klasie, przejmuje jej metody i pola, oraz dodaje własne by dostosować ją do konkretnego zadania. Klasę po której się dziedziczy określa się nadklasą, klasą bazową lub klasą macierzystą. Nowo utworzona klasa nazywa się podklasą, klasą pochodną lub klasą potomną.

extends = dziedziczy po Wywołanie konstruktora nadklasy. Musi być jako pierwsza instrukcja w metodzie! Nowa metoda w klasie Samochod Metody redefiniowane w klasie potomnej. super.start() oznacza wywołanie metody start z klasy bazowej

Czemu metoda przedstawsie nie jest wywoływana z nazwą klasy tzn. TestDziedziczenia.przedstawSie()?

Jeśli redefiniujemy składową w klasie potomnej to wówczas aby odwołać się (np. by wywołać metodę) do klasy bazowej należy zastosować konstrukcje: super.nazwa_składowej; Podczas redefiniowania metody możemy również dodać przed jej sygnaturą annotacje @Override, co sugeruje kompilatorowi, że dana metoda zmienia logikę działania tak samo nazwanej metody z klasy bazowej. Przykładowo: @Override start() { System.out.println( Startuje );} Nie jest to co prawda wymagane ale pozwala uniknąć błędów (np. jeśli się pomylimy w nazwie metody, a miała ona redefiniować już istniejącą to kompilator wyświetli błąd).

Wykorzystując dziedziczenie zawsze należy przestrzegać reguły, że najpierw muszą być zainicjowane pola klasy bazowej. Z reguły ogranicza się to do wywołania odpowiedniego konstruktora klasy bazowej. Sekwencja inicjowania obiektu klasy potomnej jest następująca: 1. Wywoływany jest konstruktor klasy potomnej. 2. Jeśli pierwszą instrukcją jest super( argumenty) to wykonywany jest konstruktor klasy bazowej z podanymi argumentami. 3. Jeśli nie ma super( ) to wykonywany jest konstruktor bezparametrowy klasy bazowej. 4. Wykonywany jest kod konstruktora klasy potomnej.

3 klasy: A, B, C

Jaki będzie wynik?

Java nie posiada wielodziedziczenia* można dziedziczyć tylko z jednej klasy, a nie z wielu tak jak np. w C++. Czy zatem wielodziedziczenie jest dobre czy złe? Hierarchia dziedziczenia wszystkich klas zaczyna się w jednym miejscu w Javie wszystko jest obiektem. Wszystkie klasy automatycznie dziedziczą po klasie Object. Można nawet napisać jawnie: A extends Object jednak taki zapis nic nie zmieni. Dzieje się tak po prostu zawsze, bez względu na to czy używamy mechanizmu dziedziczenia czy też nie. * Ale ma mechanizm interfejsów, dzięki czemu można wielodziedziczenie zasymulować

Odwołania do każdego obiektu można przekształcić do referencji do jego dowolnej nadklasy. Mechanizm ten nosi nazwę referencyjnej konwersji rozszerzającej lub obiektowej konwersji rozszerzającej. Można się spotkać również z terminem upcasting, ponieważ dokonujemy rzutowania (cast) w góre hierarchii dziedziczenia. Upcasting jest dokonywany automatycznie gdy: 1. Przypisujemy zmiennej odniesienie do obiektu klasy pochodnej. 2. Jeśli dokonujemy przekazania obiektu metodzie, a jej parametr jest referencją do nadklasy. 3. Zwracamy wynik, gdy będzie on podstawiony na zmienną będącą referencją do obiektu nadklasy zwracanego wyniku.

Automatyczny upcasting

Dokonaliśmy w klasie Samochód redefinicji dwóch metod: start() która dla Samochodów sprawdza czy mają one paliwo by ruszyć, natomiast dla Pojazdów nie ma tego warunku. tostring() która dla obiektów klasy Samochód zwraca napis w innej formie niż dla obiektów klasy Pojazd. Jeśli zatem zapiszemy: Samochod c = new Samochod(); //tworzymy nowy obiekt Pojazd p = c; //dokonujemy upcastingu To jaki będzie wynik użycia metod start() i tostring() wobec obiektu p? p.start(); System.out.println(p.toString()); Które wersje metod start() i tostring() zostaną wywołane? Te z klasy Pojazd czy te z klasy Samochód? I dlaczego tak a nie inaczej?

Załóżmy, że chcemy stworzyć program symulujący wyścig Rowerów, Samochodów i Rydwanów. Wszystkie te klasy będą dziedziczyć z klasy pojazd, oraz będą redefiniować metodę tostring() z klasy Pojazd. Sygnał do startu wszystkich pojazdów daje starter. Po sygnale startera, wszystkie pojazdy jeśli mogą to ruszają do wyścigu.

Dlaczego to tak działa? I Koń wygrał

Wiązanie odwołań z kodem w fazie wykonania (podczas runtime) nosi nazwę dynamic binding lub late binding. Technicznie jest ono realizowane przez wykorzystanie ukrytego pola w obiekcie, wskazującego na jego prawdziwy typ. Mówimy, że odwołania do metod wirtualnych są polimorficzne efekt wywołania może przybierać różne kształty w zależności od tego jaki jest faktyczny typ obiektu na rzecz którego wywołano metodę wirtualną. W Javie wszystkie metody są wirtualne za wyjątkiem: Metod statycznych. Metod ze specyfikatorem final. Metod prywatnych.

Metoda abstrakcyjna nie ma implementacji (ciała) i powinna być zadeklarowana ze specyfikatorem abstract. Przykładowo: abstract int getglos(); //tylko średnik bez kodu Klasa w której zadeklarowano jakąkolwiek metodę abstrakcyjną jest nazywana klasą abstrakcyjną i musi być opatrzona specyfikatorem abstract. Przykładowo abstract class Zwierz { int liczba_zwierzatek; abstract int getglos(); void dajglos() {System.out.println(getGlos()); } } Przy założeniu, że metoda getgłos() definiuje jakie dźwięki wydają poszczególne zwierzęta i będzie ona redefiniowana w klasach potomnych, to w każdej z klas potomnych możemy wykorzystać metodę dajglos(), bez potrzeby zmiany jej implementacji. Wszystkie zwierzęta będą wydawały właściwe dźwięki. Po co są klasy i metody abstrakcyjne?

Metody abstrakcyjne są jak inne metody w Javie metodami wirtualnymi co znaczy też że: Mogą mieć różną definicję dla różnych typów obiektów (przy konkretyzacji). Sposób ich działania nie jest jeszcze dokładnie sprecyzowany. Niekoniecznie istnieją gdzieś wcześniej. Proszę zauważyć, że w metodzie dajglos() została użyta nieistniejąca (niezdefiniowana) jeszcze metoda. Pozwala to jednak odwoływać się do funkcjonalności która być może powstanie w przyszłości. Należy również pamiętać o zasadzie, że klasa dziedzicząca po klasie abstrakcyjnej musi implementować wszystkie abstrakcyjne metody, lub sama musi być klasą abstrakcyjną i musi być opatrzona specyfikatorem abstract.

1. Posługując się przykładem z wykładu (klasy Pojazd i Samochód) zdefiniować klasę PojazdSilnikowy, dziedziczącą po klasie Pojazd. Wszystkie pojazdy silnikowe mają następujące własności: Mają numer rejestracyjny, Są napędzane paliwem, więc mają też bak o określonej pojemności, oraz mogą zostać zatankowane poprzez metodę fill(int) która oznacza wlanie do baku n litrów paliwa. Następnie zmodyfikować klasę samochód tak by dziedziczyła po klasie PojazdSilnikowy. Przetestować wprowadzone zmiany wyświetlając aktualny stan samochodu a następnie tankując samochód i wprowadzając go w ruch. Klasy Pojazd, Osoba i Samochód są dostępne pod adresem: http://www.tomaszx.pl/materialy/ztp_lab2_pojazd.zip

Zdefiniować klasę Data zawierającą pola prywatne: int dzien, int miesiac, int rok. Klasa powinna zawierać funkcje dostępowe, pobierające zawartość poszczególnych pól (np. podajdzien itd.), oraz funkcje pozwalające na ustalanie zawartości pól (np. ustawdzien, itd.). Funkcje ustawiania wartości mogą w tej wersji nie kontrolować poprawności parametrów wstawianych do pól. Klasa ma posiadać konstruktor domyślny, zerujący wszystkie pola, oraz konstruktor ogólny, otrzymujący trzy parametry, trafiające odpowiednio do pól opisujących dzień, miesiąc, rok. Proszę zdefiniować klasę pochodną klasy Data DataZKontrolą. W klasie tej należy dokonać redefinicji funkcji ustawiających wartości pól ( ustawdzien, itd.), tak aby dokonywały kontroli wartości parametrów, adekwatnie dla charakteru pola. Klasa DataZKontrolą powinna posiadać konstruktor domyślny zerujący wszystkie pola, oraz konstruktor ogólny, otrzymujący trzy parametry, trafiające odpowiednio do pól opisujących godzinę, minutę, sekundę. Proszę pamiętać o aktywowaniu konstruktorów klasy bazowej.

2. Korzystając z klasy PojazdSilnikowy napisać nową klasę o nazwie Bus. Wszystkie autobusy mają następujące dodatkowe właściwości: Liczbę miejsc ogółem. Liczbę wolnych miejsc. Następnie przetestować nową klasę korzystając z kodu zawartego na: http://www.tomaszx.pl/materialy/ztp_lab2_zadanie2.java Tak aby program wyświetlił napisy: Pojazd silnikowy BUS123 JEDZIE; Pojazd silnikowy BUS234 JEDZIE; Pojazd silnikowy WAR123 JEDZIE; Pojazd silnikowy KAC323 JEDZIE;

Zaprojektuj klasę RownanieKwadratowe, rozwiązującą równanie kwadratowe zapisane jako: Ax 2 + Bx + C = 0 Klasa powinna posiadać pola prywatne A, B, C, reprezentujące współczynniki równania, wraz z odpowiednimi akcesorami i modyfikatorami. Dodatkowo należy stworzyć funkcję składową delta(), obliczającą wyróżnik trójmianu, oraz trzy funkcje obliczające miejsca zerowe. Klasa powinna być wyposażona w konstruktor domyślny oraz trójparametrowy konstruktor ogólny. Należy zastanowić się nad przypadkiem, gdy równanie staje się liniowym tzn. A = 0 i zaproponować rozwiązanie tego problemu.

Zdefiniować klasy reprezentujące płaskie figury geometryczne: Kwadrat, Prostokat, Kolo, Trapez. Klasy powinny posiadać pola przechowujące informacje niezbędne do obliczenia pól tych figur. Pola powinny być prywatne, dostęp do nich powinien być zapewniany przez odpowiednie metody pobierania i ustawiania wartości. Klasy powinny posiadać konstruktor bezparametrowy oraz ogólny, zapewniające inicjalizację wszystkich pól. Obliczenie pola danej figury powinna realizować odpowiednia funkcja składowa o nazwie obliczpole wyznaczona wartość pola powinna być jej rezultatem.

3. Bazując na klasach opisu figur płaskich stworzonych wcześniej, zdefiniować ich klasy pochodne, reprezentujące bryły: sześcian, prostopadłościan, kula, graniastosłup o podstawie trapezu. W klasach pochodnych należy dodać wszelkie informacje konieczne dla obliczenia pól tych brył oraz należy przedefiniować funkcje składowe obliczania pola (funkcje obliczpole każdej z klas reprezentujących figurę płaską), tak by wyznaczały właściwe pola brył.

Napisać program symulujący zakupy w sklepie z owocami. Klasa testująca klasę Sklep wygląda następująco: Wynik działania programu: