Kompozycja i dziedziczenie klas

Podobne dokumenty
Kompozycja i dziedziczenie klas

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Definiowanie własnych klas

Dziedziczenie jednobazowe, poliformizm

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

Definiowanie własnych klas

Dokumentacja do API Javy.

Dziedziczenie. dr Jarosław Skaruz

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

Wykład 6: Dziedziczenie

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

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

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe

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

PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

J zyk Java cz 1 (streszczenie)

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

Programowanie obiektowe

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

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

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

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

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

Programowanie obiektowe

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

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Mechanizm dziedziczenia

Aplikacje w środowisku Java

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

Wykład 4: Klasy i Metody

Technologie i usługi internetowe cz. 2

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

Język Java część 1 (streszczenie)

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

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

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ęść 1 (streszczenie)

Programowanie w Javie - wykład 3

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Wykład 8: klasy cz. 4

Informatyka II Laboratorium 3 : Programowania obiektowe C++ - dziedziczenie

Wykład 7: Pakiety i Interfejsy

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

Programowanie obiektowe

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Przypomnienie o klasach i obiektach

DOSTĘP DO METOD I ZMIENNYCH, TABLICE. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla kaŝdego, Helion 2001)

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

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

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

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

Programowanie obiektowe

Materiały do zajęć VII

PARADYGMATY PROGRAMOWANIA Wykład 4

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

Rozdział 4 KLASY, OBIEKTY, METODY

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Polimorfizm. dr Jarosław Skaruz

Dziedziczenie i interfejsy

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Języki i metody programowania Java. Wykład 2 (część 2)

Mechanizm dziedziczenia

TEMAT : KLASY DZIEDZICZENIE

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

.NET Klasy, obiekty. ciąg dalszy

JAVA- wykład 2 Klasy

Projektowanie obiektowe. Roman Simiński Polimorfizm

Dziedziczenie. Ogólna postać dziedziczenia klas:

PHP 5 język obiektowy

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

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

Programowanie obiektowe

Podstawy Języka Java

OBIEKTY PHP. G. Panuś

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

Język Java wątki (streszczenie)

Wykład 5: Klasy cz. 3

Programowanie obiektowe

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

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

Wstęp do programowania obiektowego. Wykład 2

Programowanie w Internecie. Java

Kurs WWW. Paweł Rajba.

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Pola i metody statyczne

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

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Programowanie obiektowe i zdarzeniowe

Wprowadzenie do programowanie obiektowego w języku C++

PARADYGMATY PROGRAMOWANIA Wykład 2

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe i język Java

Języki programowania imperatywnego

Transkrypt:

Związki między klasami: jest i zawiera Programowanie obiektowe Przkład: Pojazd Kompozycja i dziedziczenie klas Silnik Pojazd silnikowy Rower Wóz konny Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Silnik elektryczny Silnik spalinowy Motocykl Samochód Pojazd silnikowy jest szczególnym rodzajem Pojazdu Motocykl jest szczególnym rodzajem Pojazdu silnikowego Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 1 / 26 Pojazd silnikowy zawiera Silnik Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 2 / 26 Ponowne wykorzystanie klas Przy tworzeniu nowych klas moŝna wykorzystywać juŝ istniejące klasy za pomocą: kompozycji, dziedziczenia. Kompozycję stosuje się wtedy, gdy między klasami zachodzi relacja typu całość część tzn. nowa klasa zawiera w sobie istniejącą klasę. Dziedziczenie stosuje się wtedy, gdy między klasami zachodzi relacja generalizacja specjalizacja tzn. nowa klasa jest szczególnym Diagramy klas w języku UML UML (ang. Unified Modeling Language) zunifikowany język modelowania do tworzenia systemów obiektowo zorientowanych. Diagram klas pokazuje klasy i zachodzące między nimi relacje. generalizacja specjalizacja NowaKlasa jest szczególnym rodzajem KlasyBazowej rodzajem juz istniejącej klasy. Uwaga: Zwykle tworzy się nowe klasy wykorzystując jednocześnie kompozycję i dziedziczenie np.: klasa Pojazd silnikowy jest uszczegółowieniem klasy Pojazd oraz zawiera w sobie klasę Silnik. Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 3 / 26 całość część NowaKlasa zawiera n-krotnie pola KlasySkladowej Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 4 / 26

Kompozycja Kompozycję uzyskujemy poprzez definiowanie w nowej klasie pól, które są obiektami istniejących klas. Klasa Osoba zawiera: pola nazwisko i imie, które naleŝą do klasy. Klasa Ksiązka zawiera: pole autor naleŝące do klasy osoba, pole tytul naleŝące do klasy, pole cena typu double. Kompozycja cd. Definicja klasy Osoba class Osoba private nazwisko; private imie; public Osoba( nazwisko, imie) this.nazwisko = nazwisko; this.imie = imie; public podajnazwisko() return nazwisko; public podajimie() return imie; Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 5 / 26 Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 6 / 26 Kompozycja cd. Definicja klasy Ksiazka class Ksiazka private Osoba autor; private tytul; double cena; Kompozycja cd. Przykładowa instrukcja tworząca nowy obiekt klasy Ksiazka: Ksiazka lektura = new Ksiazka( new Osoba( Sienkiewicz, Henryk ), Potop, 32.5 ); public Ksiazka(Osoba autor, tytul, double cena) this.autor = autor; this.tytul = tytul; this.cena = cena; public Osoba podajautor() return autor; public podajtytul() return tytul; public double podajcena() return cena; lektura Ksiazka autor tytul cena 32.5 Osoba nazwisko imie Potop Sienkiewicz Henryk Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 7 / 26 Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 8 / 26

Dziedziczenie Dziedziczenie polega na przejęciu właściwości i funkcjonalności obiektów innej klasy i ewentualnej modyfikacji tych właściwości i funkcjonalności w taki sposób, by były one bardziej wyspecjalizowane. Do wyraŝania relacji dziedziczenia jednej klasy przez drugą słuŝy słowo kluczowe extends class B extends A... Klasa Publikacja zawiera: pole tytul z klasy i pole cena typu double. Klasa Ksiązka dziedziczy po klasie Publikacja i dodatkowo zawiera: pole autor naleŝące do klasy. Klasa Czasopismo dziedziczy po klasie Publikacja i dodatkowo zawiera: pole numer typu int. Klasa B dziedziczy (rozszerza) klasę A, tzn. klasa A jest klasą bazową, (superklasą) klasy B klasa B jest klasą pochodną klasy A Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 9 / 26 Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 10 / 26 Definicja klasy bazowej Publikacja class Publikacja private tytul; private double cena; Publikacja( tytul, double cena) this.tytul = tytul; this.cena = cena; public podajtytul() return tytul; public double podajcene() return cena; Definicja klas pochodnych Ksiazka i Czasopismo, które dziedziczą po klasie Publikacja class Ksiazka extends Publikacja private autor; Ksiazka( autor, tytul, double cena) super(tytul, cena); // Wywołanie konstruktora klasy bazowej Publikacja this.autor = autor; public podajautor() return autor; class Czasopismo extends Publikacja private int numer; Czasopismo( tytul, int numer, double cena) super(tytul, cena); // Wywołanie konstruktora klasy bazowej Publikacja this.numer = numer; public int podajnumer() return numer; Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 11 / 26 Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 12 / 26

Przykładowe instrukcje tworzące nowe obiekty klas Ksiazka i Czasopismo: Ksiazka lektura = new Ksiazka( Bolesław Prus, Lalka, 22.50 ); Czasopismo gazeta = new Czasopismo( Przektój, 12, 3.90 ); lektura gazeta Ksiazka tytul cena 22.50 autor Publikacja(...) podajtytul() podajcena() Ksiazka(...) podajautor() Lalka Czasopismo tytul cena 3.90 numer 12 Publikacja(...) podajtytul() podajcena() Czasopismo(...) podajnumer() Bolesław Prus Przekrój Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 13 / 26 Inicjowanie obiektów przy dziedziczeniu Pola klasy bazowej moŝna inicjować za pomocą wywołania z konstruktora klasy pochodnej konstruktora klasy bazowej: super(args); gdzie args jest listą argumentów przekazanych do konstruktora klasy bazowej Jeśli konstrukcja super(...) występuje, MUSI być pierwszą instrukcją konstruktora klasy pochodnej. Gdy nie występuje, przed wykonaniem kodu klasy pochodnej zostanie wywołany konstruktor bezparametrowy klasy bazowej. Czasopismo( tytul, int numer, double cena) super(tytul, cena); this.numer = numer; Wywołanie konstruktora klasy bazowej Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 14 / 26 Inicjowanie obiektów przy dziedziczeniu cd. Przy tworzeniu obiektów klas pochodnych podstawową regułą jest, Ŝe najpierw muszą być zainicjowane pola odziedziczone z klasy bazowej, potem dodatkowe pola deklarowane w klasie pochodnej. Sekwencja inicjowania obiektu klasy pochodnej jest następująca: 1. Wywoływany jest konstruktor klasy pochodnej, 2. Jeśli pierwszą instrukcją jest super(args), wykonywany jest konstruktor klasy bazowej z argumentami args. 3. Jeśli nie ma super(args), wykonywany jest konstruktor bezparametrowy klasy bazowej. 4. Wykonywane są instrukcje wywoływanego konstruktora klasy pochodnej. Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 15 / 26 Inicjowanie obiektów przy dziedziczeniu cd. class A A() System.out.println(" Konstruktor bezparametrowy klasy A"); A( t) System.out.println(" Konstruktor klasy A z parametrem " + t); class B extends A B() System.out.println(" Konstruktor bezparametrowy klasy B"); B(int i) System.out.println(" Konstruktor klasy B z parametrem int " + i); B( t) super(t); System.out.println(" Konstruktor klasy B z parametrem " + t); class C extends B Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 16 / 26

Inicjowanie obiektów przy dziedziczeniu cd. class KlasyABC public static void main( [] args) System.out.println("Tworzenie obiektu B -> new B();"); new B(); System.out.println("\nTworzenie obiektu B -> new B(int);"); new B(1); System.out.println("\nTworzenie obiektu B -> new B();"); new B("Ala"); System.out.println("\nTworzenie obiektu C -> new C();"); new C(); Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 17 / 26 PrzeciąŜanie metod PrzeciąŜanie metod w klasie polega na definiowaniu wielu metod o tej samej nazwie ale odmiennej liście parametrów. PrzeciąŜane mogą być zarówno konstruktory jak i metody statyczne i niestatyczne. class Para int a, b; Para() System.out.println(" Konstruktor bezparametrowy"); a = b = 0; Para(int x, int y) System.out.println(" Konstruktor z parametrami"); a = x; b = y; void pokaz() System.out.println("Metoda bez parametru"); System.out.println("Para("+ a +", "+ b +")" ); void pokaz( tekst) System.out.println("Metoda z parametrem"); System.out.print(tekst); pokaz(); PrzeciąŜone konstruktory PrzeciąŜone konstruktory metody Wywołanie metody przeciąŝonej Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 18 / 26 PrzeciąŜanie metod cd. public static void main([] args) System.out.println("<=== Tworzenie obiektow ===>"); Para p1 = new Para(); Para p2 = new Para(3,7); System.out.println("\n<=== Metoda pokaz bez parametru ===>"); p2.pokaz(); System.out.println("\n<=== Metoda pokaz z parametrem ===>"); p2.pokaz("para p2: "); Przedefiniowanie metody Przedefiniowanie metody klasy bazowej w klasie pochodnej następuje wtedy, gdy w klasie pochodnej zdefiniujemy metodę z taką samą sygnaturą (nazwa i lista parametrów) i typem wyniku jak sygnatura i typ wyniku nieprywatnej i niestatycznej metody klasy bazowej. Wówczas metoda klasy bazowej zostaje ukryta. class Para int a, b; Para(int x, int y) System.out.println(" Konstruktor z parametrami"); a = x; b = y; void pokaz() System.out.println("Metoda bez parametru z klasy Para"); System.out.println("Para("+ a +", "+ b +")" ); Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 19 / 26 Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 20 / 26

Przedefiniowanie metody cd. class Trojka extends Para int c; Trojka(int x, int y, int z) super(x, y); c = z; void pokaz() System.out.println("Metoda bez parametru z klasy Trojka"); System.out.println("Trojka("+ a +", "+ b +", "+ c +")" ); void pokaz( tekst) System.out.println("Metoda z parametrem z klasy Trojka"); System.out.println(tekst); pokaz(); super.pokaz(); public static void main([] args) System.out.println("<=== Tworzenie obiektow ===>"); Trojka t1 = new Trojka(1, 2, 3); System.out.println("\n<=== Metoda pokaz bez parametru ===>"); t1.pokaz(); System.out.println("\n<=== Metoda pokaz z parametrem ===>"); t1.pokaz("trojka t1: "); Wywołanie konstruktora klasy bazowej Przedefiniowanie metody z klasy bazowej PrzeciąŜenie metody Wywołanie metody przedefiniowanej Wywołanie metody z klasy bazowej Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 21 / 26 Przedefiniowanie metody cd. Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 22 / 26 Pokrycie metody statycznej Pokrycie metody statycznej klasy bazowej w klasie pochodnej następuje wtedy, gdy w klasie pochodnej zdefiniujemy statyczną metodę z taką samą sygnaturą (nazwa i lista parametrów) i typem wyniku jak sygnatura i typ wyniku nieprywatnej i statycznej metody klasy bazowej. Wówczas metoda klasy bazowej zostaje ukryta. MoŜna się do niej odwołać z innej metody poprzedzając wywołanie metody nazwą klasy bazowej i operatorem.. Uwaga: W podobny sposób moŝna pokrywać pola klasy bazowej. NaleŜy w klasie pochodnej zdefiniować pole o tej samej nazwie (moŝe być innego typu). Pokrycie metody statycznej cd. class KlasaBazowa static void drukuj() System.out.println("Metoda statyczna klasy bazowej"); class KlasaPochodna extends KlasaBazowa static void drukuj() System.out.println("Metoda statyczna klasy pochodnej"); public static void main([] args) drukuj(); KlasaBazowa.drukuj(); Pokrycie metody statycznej z klasy bazowej Wywołanie metody statycznej z klasy pochodnej Wywołanie metody statycznej z klasy bazowej Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 23 / 26 Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 24 / 26

Przedefiniowanie i pokrycie - podsumowanie Metody prywatne nie mogą być przedefiniowane ani pokryte, gdyŝ nie są dostępne w klasie pochodnej. Metoda nieprywatna i niestatyczna jest przedefiniowana w klasie pochodnej, jeśli ma taką samą sygnaturę jak metoda klasy bazowej. Typ wyniku metody przedefiniowującej w klasie pochodnej musi być taki sam jak typ wyniku metody przedefiniowanej z klasy bazowej. Przy przedefiniowaniu moŝna za pomocą specyfikatorów dostępu rozszerzać dostęp, ale nie moŝna go zawęŝać. Metody statyczne nie mogą być przedefiniowane ale mogą być pokryte. Przy przedefiniowaniu i pokryciu metod trzeba zachować zgodność typów wyjątków zgłaszanych przez metodę i deklarowanych w klauzuli throws. Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 25 / 26 Hierarchia dziedziczenia w Javie Jeśli przy definicji klasy nie uŝywamy słowa extends (tzn. nie Ŝądamy jawnie dziedziczenia) to nasza klasa domyślnie dziedziczy klasę Object. W Javie kaŝda klasa moŝe bezpośrednio odziedziczyć tylko jedną klasę. Ale pośrednio moŝe mieć dowolnie wiele nadklas. class A W Javie wszystkie klasy pochodzą pośrednio od klasy Object class B extends A class C extends A class D extends B class E extends E Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 26 / 26