Kompozycja i dziedziczenie klas



Podobne dokumenty
Kompozycja i dziedziczenie klas

Polimorfizm, metody wirtualne i klasy abstrakcyjne

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

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

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Dziedziczenie. dr Jarosław Skaruz

Dokumentacja do API Javy.

KATEDRA INFORMATYKI STOSOWANEJ PŁ ANALIZA I PROJEKTOWANIE SYSTEMÓW INFORMATYCZNYCH

Wykład 6: Dziedziczenie

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

Definiowanie własnych klas

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

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

PROGRAMOWANIE OBIEKTOWE W C++ - cz 1. Definicja klasy, składniki klasy, prawa dost pu, definiowanie funkcji składowych, konstruktory i destruktory.

Projektowanie i programowanie obiektowe (materiały do wykładu cz. VI)

JĘZYK UML JAKO NARZĘDZIE MODELOWANIA PROCESU PROJEKTOWO-KONSTRUKCYJNEGO

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

Kancelaris - Zmiany w wersji 2.50

API transakcyjne BitMarket.pl

Wartości domyślne, szablony funkcji i klas

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

Projektowanie systemów informacyjnych: język UML

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

Programowanie obiektowe

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Enkapsulacja, dziedziczenie, polimorfizm

Praca na wielu bazach danych część 2. (Wersja 8.1)

Mechanizmy refleksji w Javie i C# Autor: Aleksander Nałęczyński

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

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

Programowanie w Javie - wykład 3

System zarządzania bazą danych (SZBD) Proces przechodzenia od świata rzeczywistego do jego informacyjnej reprezentacji w komputerze nazywać będziemy

class A { public: A(): i(5), s("abc") { } int i; string s; };

Analiza systemowa. Andrzej Łachwa Bazy danych 12+/15

Programowanie obiektowe i zdarzeniowe

J zyk Java cz 1 (streszczenie)

Tworzenie modelu obiektowego


Dziedziczenie jednobazowe, poliformizm

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

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

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Automatyka. Etymologicznie automatyka pochodzi od grec.

Aplikacje w środowisku Java

Programowanie obiektowe w C++ Wykład 11

Technologie i usługi internetowe cz. 2

Wtedy wystarczy wybrać właściwego Taga z listy.

Integracja systemów, integracja procesów

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

WYMAGANIA EDUKACYJNE I KRYTERIA OCENIANIA Z PRZEDMIOTU PROGRAMOWANIE APLIKACJI INTERNETOWYCH

Programowanie obiektowe

Programowanie obiektowe

E-faktura PKP Energetyka

PERSON Kraków

Wykład 4: Klasy i Metody

Funkcje składowe (metody)

Aplikacje w środowisku Java

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

Definiowanie własnych klas

KLAUZULE ARBITRAŻOWE

1. Podstawy budowania wyra e regularnych (Regex)

INTENSE BUSINESS INTELLIGENCE PLATFORM

Programowanie obiektowe

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

Programowanie obiektowe w Perlu

Aplikacja wielow tkowa prosty komunikator

Twierdzenie Bayesa. Indukowane Reguły Decyzyjne Jakub Kuliński Nr albumu: 53623

JAVA- wykład 2 Klasy

Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych ul. Koszykowa 75, Warszawa

PROJEKTOWANIE SYSTEMÓW LOGISTYCZNYCH PROJEKT SYSTEMY LOGISTYCZNE PODSTAWY TEORETYCZNE

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

Platformy Programistyczne Podstawy języka Java

Regulamin konkursu na Logo Stowarzyszenia Wszechnica Zawodowa Nasza Szkoła

PARADYGMATY PROGRAMOWANIA Wykład 4

Strukturalne metodyki projektowania systemûw informatycznych

Charakterystyka systemów plików

Klasy abstrakcyjne, interfejsy i polimorfizm

Mechanizm dziedziczenia

Metody Metody, parametry, zwracanie wartości

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

Bazy danych II. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski

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

Microsoft Management Console

Programowanie obiektowe

Wdrożenie modułu płatności eservice dla systemu Virtuemart 2.0.x

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

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

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Automatyczne przetwarzanie recenzji konsumenckich dla oceny użyteczności produktów i usług

Programowanie obiektowe

Pracownia budowy pojazdów samochodowych.

Języki programowania imperatywnego

Transkrypt:

Programowanie obiektowe Kompozycja i dziedziczenie klas Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 1 / 26

Związki między klasami: jest i zawiera Przkład: Pojazd Silnik Pojazd silnikowy Rower Wóz konny Silnik elektryczny Silnik spalinowy Motocykl Samochód Pojazd silnikowy jest szczególnym rodzajem Pojazdu Motocykl jest szczególnym rodzajem Pojazdu silnikowego 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 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

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 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. Przykład: Klasa Osoba zawiera: pola nazwisko i imie, które należą do klasy String. Klasa Ksiązka zawiera: pole autor należące do klasy osoba, pole tytul należące do klasy String, pole cena typu double. Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 5 / 26

Kompozycja cd. Definicja klasy Osoba class Osoba private String nazwisko; private String imie; public Osoba(String nazwisko, String imie) this.nazwisko = nazwisko; this.imie = imie; public String podajnazwisko() return nazwisko; public String podajimie() return imie; 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 String tytul; double cena; public Ksiazka(Osoba autor, String tytul, double cena) this.autor = autor; this.tytul = tytul; this.cena = cena; public Osoba podajautor() return autor; public String podajtytul() return tytul; public double podajcena() return cena; Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 7 / 26

Kompozycja cd. Przykładowa instrukcja tworząca nowy obiekt klasy Ksiazka: Ksiazka lektura = new Ksiazka( new Osoba( Sienkiewicz, Henryk ), Potop, 32.5 ); lektura Ksiazka autor tytul cena 32.5 Osoba nazwisko imie String Potop String Sienkiewicz String Henryk 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 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

Przykład: Dziedziczenie cd. Klasa Publikacja zawiera: pole tytul z klasy String i pole cena typu double. Klasa Ksiązka dziedziczy po klasie Publikacja i dodatkowo zawiera: pole autor należące do klasy String. Klasa Czasopismo dziedziczy po klasie Publikacja i dodatkowo zawiera: pole numer typu int. Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 10 / 26

Dziedziczenie cd. Definicja klasy bazowej Publikacja class Publikacja private String tytul; private double cena; Publikacja(String tytul, double cena) this.tytul = tytul; this.cena = cena; public String podajtytul() return tytul; public double podajcene() return cena; Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 11 / 26

Dziedziczenie cd. Definicja klas pochodnych Ksiazka i Czasopismo, które dziedziczą po klasie Publikacja class Ksiazka extends Publikacja private String autor; Ksiazka(String autor, String tytul, double cena) super(tytul, cena); // Wywołanie konstruktora klasy bazowej Publikacja this.autor = autor; public String podajautor() return autor; class Czasopismo extends Publikacja private int numer; Czasopismo(String 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 12 / 26

Dziedziczenie cd. 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() String Lalka Czasopismo tytul cena 3.90 numer 12 Publikacja(...) podajtytul() podajcena() Czasopismo(...) podajnumer() String Bolesław Prus String 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. Przykład: Czasopismo(String 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(String t) System.out.println(" Konstruktor klasy A z parametrem String " + 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(String t) super(t); System.out.println(" Konstruktor klasy B z parametrem String " + 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(string [] 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(String);"); 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. Przykład: 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(string 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(string[] 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: "); Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 19 / 26

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. Przykład: 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 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(string tekst) System.out.println("Metoda z parametrem z klasy Trojka"); System.out.println(tekst); pokaz(); super.pokaz(); public static void main(string[] 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). Kompozycja i dziedziczenie klas Autor: Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki PWr 23 / 26

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(string[] args) drukuj(); Pokrycie metody statycznej z klasy bazowej Wywołanie metody statycznej z klasy pochodnej KlasaBazowa.drukuj(); Wywołanie metody statycznej z klasy bazowej 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. W Javie wszystkie klasy pochodzą pośrednio od klasy Object class A 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