hierarchie klas i wielodziedziczenie

Podobne dokumenty
Wykład 1. Projektowanie efektywnych algorytmów przetwarzania danych w sieciowych systemach usług, rzeczy i multimediów.

Programowanie obiektowe - 1.

Podstawy Programowania Obiektowego

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

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

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

Technologie i usługi internetowe cz. 2

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

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

Modelowanie i Programowanie Obiektowe

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

Dziedziczenie. Ogólna postać dziedziczenia klas:

Wykład 9: Metody wirtualne i polimorfizm

Dziedziczenie jednobazowe, poliformizm

Programowanie obiektowe W1 Wprowadzenie. Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki

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

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

Podstawy Języka Java

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

Definiowanie własnych klas

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Wykład 9: Polimorfizm i klasy wirtualne

Definiowanie własnych klas

Zaawansowane programowanie w C++ (PCP)

Projektowanie obiektowe. Roman Simiński Polimorfizm

TEMAT : KLASY DZIEDZICZENIE

private - oznacza, że wszystkie elementy klasy bazowej zmieniają się w prywatne.

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

Dziedziczenie. Tomasz Borzyszkowski

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

Klasy abstrakcyjne i interfejsy

Interfejsy i klasy wewnętrzne

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

Materiały do zajęć VII

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

Programowanie obiektowe

Do czego służą klasy?

Szablony funkcji i szablony klas

Programowanie obiektowe język C++

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

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.

Charakterystyka oprogramowania obiektowego

Programowanie obiektowe w języku

Wzorce projektowe. dr inż. Marcin Pietroo

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

Każdy z nich posiada swoje parametry. W przypadku silnika może to być moc lub pojemność, w przypadku skrzyni biegów można mówić o skrzyni

Wprowadzenie do szablonów szablony funkcji

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

Wprowadzenie do szablonów szablony funkcji

Programowanie Obiektowe i C++ Marcin Benke

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

KLASY cz.1. Dorota Pylak

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe

Listy powiązane zorientowane obiektowo

C++ - [4-7] Polimorfizm

Programowanie obiektowe

dr inż. Jarosław Forenc

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

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

TEMAT : KLASY POLIMORFIZM

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

Technologie obiektowe

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe. Wprowadzenie

PARADYGMATY PROGRAMOWANIA Wykład 2

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Dokumentacja do API Javy.

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

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Do czego służą klasy?

ZARZĄDZANIU. Wykład VI. dr Jan Kazimirski

Java Język programowania

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

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

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie Obiektowe i C++

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

Kompozycja i dziedziczenie klas

Języki i techniki programowania Ćwiczenia 2

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

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

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

Programowanie obiektowe

Wstęp do Programowania 2

Aplikacje w środowisku Java

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

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

Transkrypt:

Programowanie Obiektowe (język C++) Wykład 15. hierarchie klas i wielodziedziczenie Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Hierarchie klas Dziedziczenie wprowadza relację pokrewieństwa pomiędzy klasami. W najprostrzym przypadku mamy do czynienia z dziedziczeniem pomiędzy dwiema klasami, co jest opisane zdaniem: i co wyraŝamy graficznie: klasa B dziedziczy po klasie A Hierarchie klas i wielodziedziczenie Z wielodziedziczeniem mamy do czynienia w sytuacji, gdy klasa dziedziczy po więcej niŝ jednej klasie ( ma więcej niŝ jedną klasę bazową ). N.p. jest tak w przypadku klas F, H i M, N na poniŝszym rysunku: Zbiór klas pokrewnych nazywa się zwyczajowo hierarchią klas. Hierarchia klas moŝe być zwykle przedstawiona strukturą drzewa lub w bardziej skomplikowanych przypadkach strukturą grafu: Tomasz Marks - Wydział MiNI PW -3- Tomasz Marks - Wydział MiNI PW -4-

struct T //triangle int tcolor; T( int tc=0 ) : tcolor( tc ) virtual cout << " triangle:" << tcolor; ; Wielodziedziczenie (1) struct TB : T //triangle with border int bcolor; TB( int tc, int bc ) : T( tc ), bcolor( bc ) cout << " border:" << bcolor; ; Wielodziedziczenie (2) struct TC : T //triangle with center int ccolor; TC( int tc, int cc ) : T( tc ), ccolor( cc ) cout << " center:" << ccolor; ; struct TBC : TB, TC //triangle with border and center TBC( int tc, int bc, int cc ) : TB( tc,bc ), TC( tc, cc ) TB::draw( ); TC::draw( ); void info( ) //cout << tcolor; // BLAD! tcolor niejednoznaczne cout << TB::tcolor; cout << TC::tcolor; cout << bcolor << ccolor; ; Tomasz Marks - Wydział MiNI PW -5- Tomasz Marks - Wydział MiNI PW -6- int main ( ) TBC tr( 1, 2, 3 ); Wielodziedziczenie (3) tr.info( ); // 1 1 2 3 tr.draw( ); // triangle:1 border:2 triangle:1 center:3 Hierarchia klas Wielodziedziczenie (4) zrealizowana: oczekiwana: //tr.tcolor = 4; // BLAD! tcolor niejednoznaczne tr.tb::tcolor = 5; tr.tc::tcolor = 6; tr.info( ); // 5 6 2 3 tr.draw( ); // triangle:5 border:2 triangle:6 center:3 Obiekt tr faktycznie zawiera dwa trójkąty ( będące podobiektami typu T zawartymi w składowych typów TB i TC ), które mogą mieć róŝne kolory, co jest sprzeczne z intencjami projektowymi. Aby usunąć ten kłopot moŝna zastosować wirtualne dziedziczenie bazy T (patrz następny przykład). Aby usunąć ten kłopot moŝna zastosować wirtualne dziedziczenie bazy T (patrz następny przykład). Tomasz Marks - Wydział MiNI PW -7- Tomasz Marks - Wydział MiNI PW -8-

Wielodziedziczenie baza wirtualna (1) struct T //triangle int tcolor; T( int tc=0 ) : tcolor( tc ) virtual cout << " triangle:" << tcolor; ; struct TB : virtual T //triangle with border int bcolor; TB( int tc, int bc ) : T( tc ), bcolor( bc ) cout << " border:" << bcolor; ; Wielodziedziczenie baza wirtualna (2) struct TC : virtual T //triangle with center int ccolor; TC( int tc, int cc ) : T( tc ), ccolor( cc ) cout << " center:" << ccolor; ; struct TBC : TB, TC //triangle with border and center TBC( int tc, int bc, int cc ) : T( tc ), TB( tc, bc ), TC( tc, cc ) TB::draw( ); TC::draw( ); void info( ) cout << tcolor; // teraz O.K. cout << TB::tcolor; cout << TC::tcolor; cout << bcolor << ccolor; ; Tomasz Marks - Wydział MiNI PW -9- Tomasz Marks - Wydział MiNI PW -10- Wielodziedziczenie baza wirtualna (3) Wielodziedziczenie baza wirtualna (1a) int main ( ) TBC tr( 1, 2, 3 ); tr.info( ); // 1 1 1 2 3 tr.draw( ); // triangle:1 border:2 triangle:1 center:3 tr.tcolor = 4; tr.tb::tcolor = 5; tr.tc::tcolor = 6; // teraz O.K. tr.info( ); // 6 6 6 2 3 tr.draw( ); // triangle:6 border:2 triangle:6 center:3 Obiekt tr zawiera teraz tylko jeden trójkąt ( będący wirtualnie dziedziczonym podobiektem typu T w składowych typów TB i TC ). W ten sposób nie ma juŝ sprzeczności z intencjami projektowymi. Ale metoda TBC::draw wypisuje dwa razy informację o trójkącie bazowym. Ten kłopot usuniemy przez wprowadzenie w kaŝdej klasie metody Draw, która wyprowadza tylko informacje specyficzne dla tej klasy (patrz następny przykład). Tomasz Marks - Wydział MiNI PW -11- struct T //triangle int tcolor; T( int tc=0 ) : tcolor( tc ) void Draw( ) cout << " triangle:" << tcolor; ; virtual void draw ( ) Draw( ); struct TB : virtual T //triangle with border int bcolor; TB( int tc, int bc ) : T( tc ), bcolor( bc ) void Draw( ) cout << " border:" << bcolor; T::Draw(); Draw( ); ; Tomasz Marks - Wydział MiNI PW -12-

Wielodziedziczenie baza wirtualna (2a) struct TC : virtual T //triangle with center int ccolor; TC( int tc, int cc ) : T( tc ), ccolor( cc ) void Draw( ) cout << " center:" << ccolor; T::Draw(); Draw( ); ; struct TBC : TB, TC //triangle with border and center TBC( int tc, int bc, int cc ) : T( tc ), TB( tc, bc ), TC( tc, cc ) void Draw( ) cout << "..."; T::Draw( ); TB::Draw(); TC::Draw(); Draw( ); ; Wielodziedziczenie baza wirtualna (3a) int main ( ) TBC tr( 1, 2, 3 ); tr.draw( ); // triangle:1 border:2 center:3... tr.tcolor = 4; tr.tb::tcolor = 5; tr.tc::tcolor = 6; // teraz O.K. tr.draw( ); // triangle:6 border:2 center:3... Metoda TBC::info została usunięta, bo nic nowego tu nie pokaŝe. Metoda TBC::draw wypisuje teraz kaŝdą potrzebną informację o trójkącie tylko jeden raz, korzystając ze specyficznych wersji metody Draw określonych w poszczególnych klasach. Tomasz Marks - Wydział MiNI PW -13- Tomasz Marks - Wydział MiNI PW -14- Co to jest Paradygmat? paradygmat obiektowy W Oxford English Dictionary paradygmat jest zdefiniowany jako wzorzec lub najogólniejszy model lub jako wzorcowy przykład. Paradygmat... - w rozumieniu wprowadzonym przez filozofa Thomasa Kuhna w ksiąŝce Struktura rewolucji naukowych (The Structure of Scientific Revolutions) opublikowanej w 1962 r.... to zbiór pojęć i teorii tworzących podstawy danej nauki. Teorii i pojęć tworzących paradygmat raczej się nie kwestionuje, przynajmniej do czasu kiedy paradygmat jest twórczy poznawczo - tzn. za jego pomocą moŝna tworzyć teorie szczegółowe zgodne z danymi doświadczalnymi (historycznymi), którymi zajmuje się dana nauka. Tomasz Marks - Wydział MiNI PW -15- Tomasz Marks - Wydział MiNI PW -16-

Podstawowe załoŝenia paradygmatu obiektowego Powszechnie uwaŝa się, Ŝe najwaŝniejsze są następujące cechy: Abstrakcja Enkapsulacja (hermetyzacja) Polimorfizm Dziedziczenie Abstrakcja Rozpatrujemy pewien system rozumiany jako układ obiektów. KaŜdy obiekt w systemie moŝna rozpatrywać jako model abstrakcyjnego elementu, który moŝe: opisywać i zmieniać swój stan, komunikować się z innymi obiektami w systemie, wykonywać pewne czynności na rzecz innych obiektów, bez ujawniania, w jaki sposób zaimplementowano dane cechy. UWAGA: Procesy, funkcje i/lub metody mogą być równieŝ abstrahowane. W taki przypadku konieczne są róŝne techniki rozszerzania abstrakcji. Tomasz Marks - Wydział MiNI PW -17- Tomasz Marks - Wydział MiNI PW -18- Enkapsulacja (hermetyzacja) Polega na ukrywaniu szczegółów implementacji. Ma to zapewnić, Ŝe obiekt nie moŝe zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu. KaŜdy typ obiektu dostarcza innym obiektom swój "interfejs", który określa dopuszczalne metody współpracy. Polimorfizm (1) W krystalografii: Polimorfizm (róŝnopostaciowość) zjawisko występowania róŝnych odmian tej samej substancji. Występuje ono wtedy, gdy ta sama substancja moŝe występować w dwóch lub nawet kilku formach krystalicznych. W takim sensie moŝna uwaŝać, Ŝe polimorfizm jest opisany stwierdzeniem: " B i C są A" dla klas B i C dziedziczących z klasy: UWAGA: Pewne języki programowania (n.p. C++) nie realizują tego załoŝenia zbyt rygorystycznie, dopuszczając pewien poziom bezpośredniego dostępu do szczegółów implementacyjnych obiektu. Prowadzi to do ograniczenia poziomu abstrakcji. W programowaniu rozumie się to na ogół w węŝszym sensie, patrz następna strona: Tomasz Marks - Wydział MiNI PW -19- Tomasz Marks - Wydział MiNI PW -20-

Polimorfizm (2) Referencje i kolekcje obiektów mogą dotyczyć obiektów róŝnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Polimorfizm w programowaniu obiektowym to wykazywanie róŝnych form działania podczas wywoływania metody w zaleŝności od tego jakiego typu obiekt jest wskazywany przez wskaźnik lub referencję. Typ z funkcjami wirtulnymi nazywa się typem polimorficznym (B. Stroustrup str. 345) UWAGA: Polimorfizm dotyczy kilku podklas tej samej klasy bazowej, które mają metody o takiej samej sygnaturze lecz róŝnych implementacjach. PrzeciąŜanie dotyczy metod tej samej klasy, które mają tę samą nazwę, lecz róŝne sygnatury. Dziedziczenie Dziedziczenie porządkuje i wspomaga polimorfizm i enkapsulację. Osiąga to dzięki umoŝliwieniu definiowania i tworzenia specjalizowanych obiektów na podstawie bardziej ogólnych. Dla obiektów specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tę, której nie mają obiekty ogólniejsze. UWAGA: W typowych przypadkach powstają grupy obiektów zwane klasami, oraz grupy klas zwane drzewami. Odzwierciedlają one wspólne cechy obiektów. Tomasz Marks - Wydział MiNI PW -21- Tomasz Marks - Wydział MiNI PW -22- Koniec wykładu 15. Tomasz Marks - Wydział MiNI PW -23-