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



Podobne dokumenty
Dziedziczenie. dr Jarosław Skaruz

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Klasy abstrakcyjne i interfejsy

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Enkapsulacja, dziedziczenie, polimorfizm

Dziedziczenie. Tomasz Borzyszkowski

Programowanie obiektowe w języku

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

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

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

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Dokumentacja do API Javy.

Polimorfizm. dr Jarosław Skaruz

Wykład 6: Dziedziczenie

Kurs WWW. Paweł Rajba.

Klasy abstrakcyjne, interfejsy i polimorfizm

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

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

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

Programowanie obiektowe i zdarzeniowe

.NET Klasy, obiekty. ciąg dalszy

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

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

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Kurs programowania. Wykład 9. Wojciech Macyna

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

dr inż. Jarosław Forenc

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

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

TEMAT : KLASY DZIEDZICZENIE

Platformy Programistyczne Podstawy języka Java

PARADYGMATY PROGRAMOWANIA Wykład 2

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

PARADYGMATY PROGRAMOWANIA Wykład 4

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Podstawy programowania III

TEMAT : KLASY POLIMORFIZM

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

Programowanie obiektowe w C++ Wykład 12

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Technologie i usługi internetowe cz. 2

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

Mechanizm dziedziczenia

Dziedziczenie. Ogólna postać dziedziczenia klas:

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

1 Atrybuty i metody klasowe

Dziedziczenie jednobazowe, poliformizm

Podstawy Programowania Obiektowego

Programowanie w Javie - wykład 3

Java: interfejsy i klasy wewnętrzne

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

Programowanie obiektowe

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Plik klasy. h deklaracje klas

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

Programowanie w Internecie. Java

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

PHP 5 język obiektowy

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Projektowanie obiektowe. Roman Simiński Polimorfizm

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

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

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

Aplikacje w środowisku Java

Programowanie obiektowe

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

Typy sparametryzowane

Programowanie obiektowe

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

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

Czym jest polimorfizm?

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Programowanie obiektowe. Wykład 03. Maciej Wołoszyn 17 marca Polimorfizm oraz wczesne i późne wiazanie

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

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

Programowanie obiektowe

JAVA- wykład 2 Klasy

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Materiały do zajęć VII

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Abstrakcyjny typ danych

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 4. Karol Tarnowski A-1 p.

Dziedziczenie & W slajdach są materiały zapożyczone z

Transkrypt:

Wykład 2 17 marca 2016

Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac starych komponentów, tworzac klasę potomna. W JAVIE słowo kluczowe extends służy do definiowania po jakiej klasie dziedziczymy. W C++ operator : (dwukropek). Pojedyncze vs. wielokrotne dziedziczenie Wiele języków obiektowych umożliwia dziedziczenie jednocześnie po kilku klasach (C++). Java ze względu na prostotę umożliwia dziedziczenie tylko po jednej klasie.

Dziedziczenie Klasa potomna dziedziczy składowe prywatne klasy bazowej, ale nie może się do nich bezpośrednio odwołać. Wygodne jest więc użycie modyfikatora dostępu protected klasy pochodne maja dostęp a inne tak jak private. Publiczne metody z klasy bazowej moga być nadpisywane w nowej klasie potomnej lub odziedziczone bezpośrednio. Nie dziedziczy się konstruktorów i destruktora (oraz operatora = w C++). Konstruktor klasy bazowej jest wywoływany jako pierwszy przed wywołaniem zawartości konstruktora klasy potomnej. Ale można samemu wywołać odpowiedni konstruktor klasy bazowej. Destruktor klasy potomnej na sam koniec wywołuje destruktor klasy bazowej. Można tylko zawężać dostęp (składowe prywatne nigdy nie będa dziedziczone jako chronione, a chronione jako publiczne).

Klasa java.lang.object Java zawiera specjalna klasę która jest korzeniem w hierarchii klas. Jest ona także domyślna klasa bazowa jeśli nie podamy przy definiowaniu klasy innej. Metody klasy Object public final Class getclass() zwraca nazwę klasy obiektu dla którego została wywołana. public int hashcode() zwraca wartość funkcji hashujacej zwiazanej z obiektem, przydatna np. do przechowywania obiektów w tablicach hashujacych. public boolean equals(object x) sprawdza czy dwa obiekty sa tym samym obiektem. public String tostring() protected void finalize() throws Throwable... i jeszcze kilka zwiazanych z watkami. Metody final nie moga być zmieniane przez klasy potomne.

Przykład 1 class TestObject { 2 public int a; 3 TestObject ( int i ) { a=i ;} 4 public int getvalue () { return a; } 5 } 6 public class ObjectTest { 7 public static void main ( String [] arg ) { 8 TestObject a= new TestObject (1), b= new TestObject (2); 9 System. out. println (" Klasa obiektu a: " +a. getclass ()); 10 System. out. println (" Hash obiektu a: " +a. hashcode ()); 11 System. out. println (" Hash obiektu b: " +b. hashcode ()); 12 System. out. println (" Porownanie a z a: "+a. equals (a )); 13 System. out. println (" Porownanie a z b: "+a. equals (b )); 14 } 15 }

Własności dziedziczenia Słowo kluczowe super w języku JAVA Słowo super pełni rolę referencji do klasy bazowej. Jeśli chcemy wywołać metodę z klasy bazowej, która nadpisaliśmy w klasie potomnej. W C++ wypisujemy po deklaracji konstruktora wstawiamy : (dwukropek) i wywołujemy konstruktor klasy bazowej Metoda super w języku JAVA Metoda super wywołuje konstruktor klasy bazowej. Używa się jej najczęściej w konstruktorze klasy pochodnej. W C++ metodę z klasy bazowej wywołujemy jak metodę statyczna (nazwa klasy i operator ::).

Przykład w języku JAVA 1 class Baza { 2 int a; 3 Baza () { a=0; System. out. println (" Domyslny konstruktor klasy Baza " ); } 4 Baza ( int i) { a=i; System. out. println (" Konstruktor klasy Baza " ); } 5 public void m1 () { System. out. println (" Baza. m1 () " ); } 6 public void m2 () { System. out. println (" Baza. m2 () " ); } 7 } 8 class Potomna extends Baza { 9 Potomna () { super (0); System. out. println (" Domyslny konstruktor klasy Potom 10 Potomna ( int i) { a=i; System. out. println (" Konstruktor klasy Potomna " ); } 11 public void m3 () { System. out. println (" Potomna. m3 () " ); super. m2 (); } 12 public void m2 () { System. out. println (" Potomna. m2 () " ); } 13 } 14 public class SuperTest { 15 public static void main ( String [] args ) { 16 Baza a = new Potomna (); 17 Potomna b = new Potomna (1); 18 Object c = new Baza (); 19 // a. m3 (); // blad kompilatora 20 b. m1 (); 21 b. m2 (); 22 b. m3 (); 23 } 24 }

Przykład w języku C++ 1 # include <iostream > 2 using namespace std ; 3 class Baza { public : 4 int a; 5 Baza () { a=0; cout << " Domyslny konstruktor klasy Baza " << endl ; } 6 Baza ( int i) { a=i; cout << " Konstruktor klasy Baza " << endl ; } 7 ~Baza () { cout << " Destruktor klasy Baza " << endl ; } 8 virtual void m1 () { cout << " Baza. m1 () " << endl ; } 9 virtual void m2 () { cout << " Baza. m2 () " << endl ; } }; 10 class Potomna : public Baza { public : 11 Potomna () : Baza (0) { cout << " Domyslny konstruktor klasy Potomna " << endl 12 Potomna ( int i) { a=i; cout << " Konstruktor klasy Potomna " << endl ; } 13 ~ Potomna () { cout << " Destruktor klasy Potomna " << endl ; } 14 void m3 () { cout << " Potomna. m3 () " << endl ; Baza :: m2 (); } 15 void m2 () { cout << " Potomna. m2 () " << endl ; } }; 16 int main ( int argc, char * argv []) { 17 Baza * a = new Potomna (); 18 Potomna * b = new Potomna (1); 19 void * c = new Baza (); 20 // a -> m3 (); // blad kompilatora 21 b -> m1 (); 22 b -> m2 (); 23 b -> m3 (); 24 delete a; delete b; delete ( Baza *) c; 25 }

Użycie referencji klasy bazowej do klasy potomnej (JAVA) Pod referencję klasy bazowej można podstawić obiekt klasy potomnej, ale można wtedy odwołać się tylko do pól i metod zdefiniowanych w klasie bazowej. Przy podstawianiu referencji klasy bazowej wskazujacej obiekt klasy potomnej pod referencję klasy potomnej musimy rzutować na typ klasy potomnej. Słowo kluczowe instanceof Konstrukcja <referencja> instanceof <nazwa klasy> sprawdza czy referencja wskazuje na obiekt należacy do podanej klasy lub potomnej. Dzięki temu możemy prawidłowo posłużyć się rzutowaniem i wywołać odpowiednie metody mimo, ze referencja nie jest odpowiedniego typu.

Przykład 1 class Baza { 2 int a; 3 Baza () { a=0; System. out. println (" Domyslny konstruktor klasy Baza " ); } 4 Baza ( int i) { a=i; System. out. println (" Konstruktor klasy Baza " ); } 5 public void m1 () { System. out. println (" Baza. m1 () " ); } 6 public void m2 () { System. out. println (" Baza. m2 () " ); } } 7 class Potomna extends Baza { 8 Potomna () { super (0); System. out. println (" Domyslny konstruktor klasy Potom 9 Potomna ( int i) { a=i; System. out. println (" Konstruktor klasy Potomna " ); } 10 public void m3 () { System. out. println (" Potomna. m3 () " ); super. m2 (); } 11 public void m2 () { System. out. println (" Potomna. m2 () " ); } } 12 public class SuperTest { 13 public static void main ( String [] args ) { 14 Object a = new Potomna (); Object b = new Baza (); 15 // a. m3 (); // blad kompilatora 16 if ( a instanceof Potomna ) { 17 System. out. println ("a wskazuje na obiekt klasy Potomna " ); 18 (( Potomna ) a ). m3 (); 19 } 20 if ( b instanceof Potomna ) 21 System. out. println ("c wskazuje na obiekt klasy Potomna " ); 22 } 23 }

Metody abstrakcyjne (wirtualne) w JAVIE słowo abstract Dzięki słowu abstract możemy tworzyć klasy lub metody które nie sa implementowane, stanowia tylko wzorzec do implementacji. Na ich podstawie tworzymy klasy potomne lub implementujemy określone metody w klasach potomnych. Nie można tworzyć obiektów klas abstrakcyjnych (można posługiwać się referencjami tych klas) ani wywoływać metod abstrakcyjnych. Ich implementacja zajmuja się klasy pochodne.

Metody abstrakcyjne (wirtualne) w C++ słowo virtual Dzięki słowu virtual możemy tworzyć metody które nie sa rozpoznawane na podstawie typu referencji czy wskaźnika, ale na podstawie typu obiektu (wiazanie dynamiczne). Dzięki słowu virtual możemy również tworzyć metody które nie sa implementowane (abstrakcyjne), stanowia tylko wzorzec do implementacji. virtual metoda_abstrakcyjna()=0 Na ich podstawie implementujemy określone metody w klasach potomnych. Klasa zawierajaca metody abstrakcyjne nazywana jest klasa abstrakcyjna.

Interfejsy w JAVIE słowa kluczowe interface i implements Interfejs definiujemy podobnie jak klasę (słowo interface zamiast class) ale nie ma ona pól tylko metody jakie powinna implementować klasa realizujaca dany interfejs. Interfejs jest więc zupełnie abstrakcyjna klasa bazowa. Klasa może realizować podane interfejsy jeśli podamy je przy definicji klasy po słowie kluczowym implements. Klasa może dziedziczyć tylko po jednej klasie bazowej ale może implementować wiele interfejsów. Interfejs może zawierać pola ale tylko zdefiniowane jako static lub final. Interfejsy moga rozszerzać inne interfejsy (nawet kilka). Korzystamy ze słowa extends.