Mechanizmy dziedziczenia

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

Programowanie obiektowe
Związki w UML.
Klasy abstrakcyjne i interfejsy
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
Programowanie obiektowe PO PO - LAB 2 Wojciech Pieprzyca.
Deklaracje i definicje klas w C++ Składowe, pola, metody Konstruktory
Programowanie obiektowe PO PO - LAB 4 Wojciech Pieprzyca.
Programowanie obiektowe
Wzorce.
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Generics w .NET 2.0 Łukasz Rzeszot.
Programowanie w środowisku sieciowym
PROGRAMOWANIE STRUKTURALNE
Programowanie obiektowe w Javie
Wielodziedziczenie od środka Konrad Lipiński
Serwery Aplikacji ASP .NET Web Objects Arkadiusz Popa.
Obiektowe metody projektowania systemów
Struktury.
Dziedziczenie i jego rodzaje
C++ wykład 5 ( ) Dziedziczenie.
C++ wykład 2 ( ) Klasy i obiekty.
Zasady zaliczenia Warunki uzyskania zaliczenia:
Wykład 8 Wojciech Pieprzyca
Języki programowania obiektowego
Wstęp do programowania obiektowego
Projektowanie i programowanie obiektowe II - Wykład II
Klasy w C++. Deklaracja klasy class NazwaTwojejKlasy { //w tym miejscu piszemy definicje typów, //zmienne i funkcje jakie mają należeć do klasy. }; //tutaj.
Podstawy programowania II
T: Różnice pomiędzy programowaniem strukturalnym a obiektowym
Źródła: podręcznikopracował: A. Jędryczkowski.
Programowanie strukturalne i obiektowe
Programowanie obiektowe III rok EiT
Programowanie obiektowe – zastosowanie języka Java SE
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład XIII.
Programowanie obiektowe III rok EiT
WPROWADZENIE W ŚWIAT OBIEKTÓW
Andrzej Repak Nr albumu
Java – coś na temat Klas Piotr Rosik
Dziedziczenie Marek Serek Dziedziczenie Dziedziczenie to jeden z fundamentów programowania obiektowego. Umożliwia sprawne i łatwe wykorzystywanie.
Dziedziczenie Maciek Mięczakowski
JAVA.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Programowanie obiektowe – język C++
Programowanie obiektowe 2013/2014
ZWIĄZKI MIĘDZY KLASAMI KLASY ABSTRAKCYJNE OGRANICZENIA INTERFEJSY SZABLONY safa Michał Telus.
Prasek Aneta, Skiba Katarzyna. Funkcje stałe const to takie funkcje, które nie mogą modyfikować stanu obiektu. Oznacza to, że funkcja stała nie może zmieniać.
Kurs języka C++ – wykład 3 ( )
Kurs języka C++ – wykład 9 ( )
Programowanie w języku C++
Kurs języka C++ – wykład 5 ( )
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Programowanie strukturalne i obiektowe C++
Model obiektowy bazy danych
Klasy ( uzupełnienie ). Definicja klasy Klasa jest zbiorem logicznie powiązanych danych i funkcji, przeznaczonych do realizacji konkretnego zadania; Zamknięcie.
Projektowanie obiektowe. Przykład: Punktem wyjścia w obiektowym tworzeniu systemu informacyjnego jest zawsze pewien model biznesowy. Przykład: Diagram.
Dziedziczenie wielobazowe. dana klasa może mieć kilka bezpośrednich klas bazowych: dana klasa może mieć kilka bezpośrednich klas bazowych: kolorpołożenie.
Programowanie Zaawansowane
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Partnerstwo dla Przyszłości 1 Lekcja 28 Dziedziczenie i rodzaje dziedziczenia.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
Zmienne typy danych w VBA. MS Excel – typy danych w języku programowania VBA.
Programowanie Obiektowe – Wykład 6
Klasy, pola, obiekty, metody. Modyfikatory dostępu, hermetyzacja
(według:
Programowanie Obiektowe – Wykład 2
Programowanie obiektowe – zastosowanie języka Java SE
PGO Dziedziczenie Michail Mokkas.
Zapis prezentacji:

Mechanizmy dziedziczenia Języki programowania obiektowego Mechanizmy dziedziczenia Andrzej Chybicki Andrzej.Chybicki@eti.pg.gda.pl Pok. 744

General Concept Typy definiowane przez użytkownika powinny jak najlepiej oddawać rzeczywistość świata modelowanego przez programistę. Klasy (obiekty) odzwierciedlają rzeczywiste obiekty Takie podejście ma umożliwić projektantowi skupienie się na koncepcji problemu, jaki ma dany program rozwiązać, a nie na sposobie działania maszyny obliczeniowej

Klasy Klasy reprezentują koncepcję problemu i są platformą pomiędzy techniczną zasadą działania komputera a rozwiązywanym zagadnieniem. Z czasem stało się jasne, że samo mechanizm definiowania klas jest niewystarczający do rozwiązywania niektórych problemów programistycznych

Dziedziczenie Różne klasy są ze sobą związane, istnieje między nimi związek. Oczywiście można ręcznie implementować ten związek za każdym razem powielając wspólne pola różnych klas czy definiując związki między nimi Rozwiązaniem tego problemu jest dziedziczenie klas

Przyklad Mamy firmę i piszemy program odzwierciedlający strukturę osób zatrudnionych w przedsiębiorstwie Zaczynami od podstawowego stanowiska : Pracownik (klasa Employee) Następnie dodajemy stanowisko Manager Jaki jest związek pomiędzy tymi klasami? Jak zdefiniować za pomocą wbudowanych mechanizmów część wspólną obu klas, co je różni? Która klasa ma dziedziczyć po której?

Przykład (bez dziedziczenia)

Omówienie Rozwiązanie to powoduje że nie trzeba powielać pól w klasie Manager, jest łatwe do zrozumienia i jasne Problemy: W tej interpretacji Manager nie jest Employee, czyli nie można używać zamiennie tych dwóch klas. Trzeba np. osobno implementować funkcje operujące na jednej i na drugiej klasie ( uciążliwe i nieefektywne) Obiekty Manager nie mogą być wstawiane do tej samej listy co obiekty Employee ( co zrobić z mechanizmem wyszukiwania pracowników firmy – przecież manager to też pracownik!!)

Przykład z dziedziczeniem

Zalety rozwiązania z dziedziczeniem Klasa manager jest podtypem klasy Employee, więc gdziekolwiek w argumencie podaje się employee tam można też podać jako argument obiekt klasy Manager, ale nie odwrotnie!!

Manager a Employee – ciąg dalszy

Omówienie przykładu i nomenklatura Klasa Employee jest klasą bazową (ang. Base Class) dla klasy Manager Klasa Manager jest klasa wywiedzioną klasy Employee (ang. derived from) Można się spotkać z terminem : Manager jest klasą dziedziczącą po klasie Employee(inherited). Supeclass i subclass Klasa Manager posiada te same pola co klasa Employee i dodatkowo pole level

Dostęp do zmiennych i funckji klasy Public – zawsze dostępna Private –zmienne i funkcje dostępne tylko dla czlonków klasy (class members) Protected – zmienne i funkcje dostępne dla członków klasy i klas wywiedzionych

Funkcje wirtualne Funkcje wirtualne pozwalają na deklarowanie funkcji w klasie bazowej oraz re-definiowanie ich w klasach wywiedzionych. O tym która z implementacji funkcji wirtualnych zostanie w danym momencie wykonana decyduje typ obiektu z którego funkcja jest wywoływana – spójrzmy na przykład:

Omówienie Slowo kluczowe virtual oznacza że funkcja print() może slużyć jako interfejs do wywolania funkcji z klasy Employee lub funkcji o tej samej nazwie i ilości argumentów z obiektów klas pochodnych To kompilator i loader w momencie wywołania danej funkcji dobiera odpowiednią implementację funkcji wirtualnej która zostanie wykonana. Funckja print() z klasy Manager nadpisuje (overrides) funkcję z klasy Employee

W wyniku otrzymujemy Smith1234 level2 Brown1234

Klasy abstrakcyjne Wiele klas jest przydatnych zarówno jako klasy zwykle oraz jako klasy będące klasami bazowymi dla innych klas(Employee). Istnieją jednak klasy, które prezentują pewien abstrakcyjny obiekt, którego istnienie nie ma sensu. Dopiero dziedziczenie po takim abstrakcyjnym obiekcie daje w efekcie użyteczny obiekt. Spójrzmy na przykład:

Klasy abstrakcyjne Taka deklaracja ma sens ale jest bezsensowna i malo elegancka: Shape s; // silly: ‘‘shapeless shape’’

Znacznie lepsze rozwiązanie

Klasy abstrakcyjne - omówienie „pure virtual functions” są inicjowane za pomocą dopisania do funkcji ciągu znaków „=0” Klasa, która posiada jedną lub więcej funkcji „pure virtual”, jest klasą abstrakcyjną Nie można tworzyć obiektów klasy abstrakcyjnej Shape s ; // error: variable of abstract class Shape

Klasa abstrakcyjna może jedynie slużyc jako klasa bazowa

Klasa wywiedziona z klasy abstrakcyjnej może też być klasą abstrakcyjną A pure virtual function that is not defined in a derived class remains a pure virtual function, so the derived class is also an abstract class. Sytuację tą ilustruje poniższy przykład:

Wielodziedziczenie (ang. multiple inheritance) Klasyczne dziedziczenie polega na rozszerzaniu konkretnej – jednej klasy bazowej. Język C umożliwia dziedziczenie po dowolnej ilości klas bazowych class Satellite : public Task , public Displayed { // ... };

Podobnie jak w tradycyjnym dziedziczeniu gdziekolwiek jako argument podajemy jedną z klas bazowych możemy równie dobrze podać jako argument klasę dziedziczącą

Pytania ? ;>

Wielodziedziczenie Zachowanie funkcji wirtualnych i klas abstrakcyjnych jest analogiczne jak w ‘single inheritance’ Istotna jest pewna różnica: Klasa wywiedziona jest podklasą dwóch albo więcej klas więc jest podtypem każdej z klas po których dziedziczy.

Wielodziedziczenie a dwuznaczność (ambiguity) Może się zdarzyć sytuacja w której obie klasy bazowe mają funckje o tej samej nazwie i argumentach. W przypadku gdy w klasie wywiedzionej wywolamy tę funkcję pojawia się problem dwu-znaczności (ambiguity). Spójrzmy na przykład:

Ilustracja problemu dwuznaczności explicit disambiguation

Inne rozwiązanie Mechanizm explicit disambiguation jest ‘brzydki’ jak mówi sam autor języka C. Aby rozwiązać powyższy problem z reguly tworzy się metodę nadpisującą w klasie wywiedzionej i w jej ciele implementuje się mechanizm explicit disambiguation. Przedstawia to poniższy przykład:

Wielodziedziczenie Wraz z umożliwieniem wielodziedziczenia istnieje możliwość dziedziczenia tej samej klasy dwukrotnie. struct Link { Link * next ; }; class Task : public Link { / / the Link is used to maintain a list of all Tasks (the scheduler list) / / ... class Displayed : public Link { / / the Link is used to maintain a list of all Displayed objects (the display list) Link Link Task Displayed Satelite

Wielokrotne dziedziczenie a dwuznaczność

Problem wielokrotnego dziedziczenia tej samej klasy bazowej rozwiązuje się poprzez stworzenie najwyższej klasy bazowej klasa wirtualną (virtual base class) Popatrzmy na kod:

Virtual base class (omówienie)

Interpretacja graficzna Storable Reciever Transmitter Radio