MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Podobne dokumenty
Dokumentacja do API Javy.

Programowanie obiektowe

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

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

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

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe i zdarzeniowe

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Aplikacje w środowisku Java

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

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Polimorfizm. dr Jarosław Skaruz

Diagramy klas. dr Jarosław Skaruz

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe

Java: interfejsy i klasy wewnętrzne

Programowanie obiektowe

Programowanie obiektowe

Dziedziczenie. Tomasz Borzyszkowski

JAVA W SUPER EXPRESOWEJ PIGUŁCE

10. Programowanie obiektowe w PHP5

Modelowanie obiektowe

Programowanie obiektowe

Systemy Rozproszone - Ćwiczenie 6

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

Mariusz Trzaska Modelowanie i implementacja systemów informatycznych

Programowanie obiektowe

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

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

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

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Programowanie i projektowanie obiektowe

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

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

Zaawansowane programowanie w C++ (PCP)

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Dziedziczenie w Javie

Programowanie Obiektowe Ćwiczenie 4

Wykład 7: Pakiety i Interfejsy

Programowanie obiektowe

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

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

Enkapsulacja, dziedziczenie, polimorfizm

Rysunek 1: Przykłady graficznej prezentacji klas.

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Programowanie obiektowe

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

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

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

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

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

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

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

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

MAS dr. Inż. Mariusz Trzaska. Realizacja asocjacji w obiektowych językach

Programowanie obiektowe

Programowanie obiektowe w języku

Wykład 6: Dziedziczenie

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

.NET Klasy, obiekty. ciąg dalszy

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

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

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

Programowanie obiektowe

Języki programowania imperatywnego

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

Współbieżność w środowisku Java

PHP 5 język obiektowy

Technologie i usługi internetowe cz. 2

Programowanie obiektowe

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

Programowanie obiektowe - 1.

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Wywoływanie metod zdalnych

Mechanizm dziedziczenia

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs WWW. Paweł Rajba.

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

MAS dr. Inż. Mariusz Trzaska

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

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

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

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

Podstawy programowania III

Programowanie obiektowe i zdarzeniowe

Decorator (dekorator)

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

Technologie obiektowe

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

MSI dr. Inż. Mariusz Trzaska. obiektowych językach programowania

Aplikacje w środowisku Java

Transkrypt:

MAS dr. Inż. Mariusz Trzaska Wykład 10 Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Zagadnienia o o o o o o Omówienie różnych rodzajów dziedziczenia, klas abstrakcyjnych oraz polimorficznego wołania metod. Realizacja podstawowego dziedziczenia Wykorzystanie klas abstrakcyjnych oraz polimorficznego wołania metod. Implementacja pozostałych rodzajów dziedziczenia: overlapping, complete, incomplete, multi-inheritance inheritance, multi-aspect, dynamic. Wady i zalety poszczególnych rozwiązań. Podsumowanie Modelowanie Systemów Informacyjnych (MSI), wykład 10 2

Dziedziczenie disjoint Modelowanie Systemów Informacyjnych (MSI), wykład 10 3

Klasa abstrakcyjna o Klasa, która nie może mieć bezpośrednich wystąpień. o Wykorzystywana do tworzenia hierarchii dziedziczenia. Modelowanie Systemów Informacyjnych (MSI), wykład 10 4

Problem biznesowy o Załóżmy, że osoby z diagramu mają jakieś dochody: Pracownik ma pensję, Student ma stypendium, Emeryt ma emeryturę. o I oczywiście chcielibyśmy mieć jakiś sposób zapytania o te dochody. Modelowanie Systemów Informacyjnych (MSI), wykład 10 5

Problem biznesowy (2) o Najprostszym sposobem wydaje się umieszczenie atrybutów w poszczególnych klasach i dodanie odpowiednich metod o W zależności od rodzaju osoby, wywołamy odpowiednią metodę. o Jakiś lepszy sposób? Modelowanie Systemów Informacyjnych (MSI), wykład 10 6

Polimorficzne wołanie metod o Wykorzystuje przesłanianie. o Umożliwia wykonywanie operacji bez ręcznego sprawdzania konkretnego rodzaju obiektu. Modelowanie Systemów Informacyjnych (MSI), wykład 10 7

Metody abstrakcyjne o Jaki kod będzie znajdował się w metodzie getdochody() w klasie Osoba? o Przecież osoba jako taka nie ma dochodów (mają je tylko jej specjalizacje). o Rozwiązanie: Oznaczmy ją jako metodę abstrakcyjną. o Metoda abstrakcyjna: nie ma ciała, musi zostać zaimplementowana w podklasach, może być tylko w klasie abstrakcyjnej. Modelowanie Systemów Informacyjnych (MSI), wykład 10 8

Pozostałe rodzaje dziedziczenia o Dziedziczenie overlapping Co z przesłanianiem i polimorficznym wołaniem metod? Modelowanie Systemów Informacyjnych (MSI), wykład 10 9

Pozostałe rodzaje dziedziczenia (2) o Dziedziczenie incomplete, complete {incomplete Modelowanie Systemów Informacyjnych (MSI), wykład 10 10

Pozostałe rodzaje dziedziczenia (3) o Wielodziedziczenie (dziedziczenie wielokrotne, multi-inheritance inheritance) Modelowanie Systemów Informacyjnych (MSI), wykład 10 11

Pozostałe rodzaje dziedziczenia (4) o Wielodziedziczenie (dziedziczenie wielokrotne, multi-inheritance inheritance) c. d.: Problemy, Idealne rozwiązanie? Co z przesłanianiem i polimorficznym wołaniem metod? Modelowanie Systemów Informacyjnych (MSI), wykład 10 12

Pozostałe rodzaje dziedziczenia (5) o Dziedziczenie wieloaspektowe (multi-aspect) Osoba {abstract -Imię -Nazwisko -Data urodzenia -/Wiek zajęcie płeć Pracownik -Badania lekarskie -Pensja +getpensja() Student -Numer indeksu -Stypendium +getstypendium() Emeryt -Emerytura +getemerytura() Kobieta -Nazwisko panieńskie +Urodz dziecko() Mężczyzna -służba wojskowa +Idz do wojska() Co z przesłanianiem i polimorficznym wołaniem metod? Modelowanie Systemów Informacyjnych (MSI), wykład 10 13

Pozostałe rodzaje dziedziczenia (6) o Dziedziczenie dynamiczne (dynamic) Modelowanie Systemów Informacyjnych (MSI), wykład 10 14

Dziedziczenie, a obiektowe języki programowania o W większości przypadków, popularne języki programowania posiadają najprostszy rodzaj dziedziczenia: Disjoint, Wielokrotne (tylko C++). o Co z pozostałymi rodzajami? Różne metody obejścia, Implementacja. o Co z klasami i metodami abstrakcyjnymi? o Co z polimorficznym wołaniem metod? Modelowanie Systemów Informacyjnych (MSI), wykład 10 15

Realizacja dziedziczenia disjoint o Ten typ dziedziczenia występuje bezpośrednio w popularnych językach programowania. Public class Osoba { private String imie; private String nazwisko; private Date dataurodzenia; public class Pracownik extends Osoba { private boolean badanialekarskie; public class Student extends Osoba { private int numerindeksu; public class Emeryt extends Osoba { Modelowanie Systemów Informacyjnych (MSI), wykład 10 16

Wykorzystanie polimorficznego wołania metod o W językach Java oraz C#: klasy abstrakcyjne, metody abstrakcyjne, polimorficzne wołanie metod występują bezpośrednio. o W języku C++ powyższe pojęcia również występują, z tym, że chęć korzystania z polimorficznego wołania metod należy zadeklarować za pomocą słowa kluczowego virtual. Modelowanie Systemów Informacyjnych (MSI), wykład 10 17

Wykorzystanie polimorficznego wołania metod (2) o Sposób wykorzystania podobny do klasycznego dziedziczenia disjoint. public abstract class Osoba { // [...] public Osoba(String imie, String nazwisko, Date dataurodzenia) { super(); this.imie = imie; this.nazwisko = nazwisko; this.dataurodzenia = dataurodzenia; public abstract float getdochody(); public class Pracownik extends Osoba { // [...] public float getdochody() { return getpensja(); public float getpensja() { return pensja; o Pozostałe klasy są zaimplementowane analogicznie do powyższych. Modelowanie Systemów Informacyjnych (MSI), wykład 10 18

Wykorzystanie polimorficznego wołania metod (3) o Tworzymy dwa obiekty: Pracownika, Studenta. o Traktujemy je po prostu jako osoby (referencja do typu osoba) o Każdą z nich pytamy o dochody (bez sprawdzania z jaką klasą mamy do czynienia). o Dzięki polimorficznemu wołaniu metody, dostajemy odpowiedzi właściwe dla poszczególnych rodzajów osób. Osoba o1 = new Pracownik("Jan", "Kowalski", new Date(), true, 4000.0f); Osoba o2 = new Student("Adam", "Abacki", new Date(), 1212, 2000.0f); System.out.println(o1.getDochody()); System.out.println(o2.getDochody()); 4000.0 2000.0 Modelowanie Systemów Informacyjnych (MSI), wykład 10 19

Realizacja dziedziczenia overlapping o Ten typ dziedziczenia nie występuje bezpośrednio w popularnych językach programowania. o Sposoby obejścia: Zastąpienie całej hierarchii dziedziczenia jedną klasą, Wykorzystanie agregacji lub kompozycji, Rozwiązania łączące powyższe metody. Modelowanie Systemów Informacyjnych (MSI), wykład 10 20

Realizacja dziedziczenia overlapping (2) o Zastąpienie całej hierarchii dziedziczenia jedną klasą Wszystkie inwarianty umieszczamy w jednej nadklasie, Dodajemy dyskryminator, który informuje nas o rodzaju obiektu (używamy EnumSet ponieważ chcemy przechowywać informacje o kilku rodzajach na raz). enum OsobaRodzaj {Osoba, Pracownik, Student, Emeryt; public class Osoba { private String imie; private String nazwisko; private Date dataurodzenia; private boolean badanialekarskie; private int numerindeksu; // Musimy uzyc EnumSet zamiast rodzajosoby poniewaz chcemy miec // mozliwosc przechowywania kombinacji osob, np. Pracownik + Student private EnumSet<OsobaRodzaj> rodzajosoby = EnumSet.<OsobaRodzaj>of(OsobaRodzaj.Osoba); Modelowanie Systemów Informacyjnych (MSI), wykład 10 21

Realizacja dziedziczenia overlapping (3) o Zastąpienie całej hierarchii dziedziczenia jedną klasą c. d. Zalety Prostota realizacji Łatwość używania Wady Brak możliwości korzystania z konstrukcji związanych z dziedziczeniem, np. przesłanianie metod, polimorficzne wołanie metod, itd. Niewykorzystywanie inwariantów należących do innej specjalizacji (mimo tego, że zajmują miejsce). Modelowanie Systemów Informacyjnych (MSI), wykład 10 22

Realizacja dziedziczenia overlapping (4) o Wykorzystanie agregacji lub kompozycji Osoba -Imię -Nazwisko -Data urodzenia -/Wiek 1 0..1 Pracownik -Badania lekarskie -Pensja +getpensja() 0..1 Student -Numer indeksu -Stypendium +getstypendium() 0..1 Emeryt -Emerytura +getemerytura() Modelowanie Systemów Informacyjnych (MSI), wykład 10 23

Realizacja dziedziczenia overlapping (5) o Wykorzystanie agregacji lub kompozycji c.d. Asocjacje z podklas pokazują na: Całość. Trzeba też zmodyfikować połączenia asocjacji (z podklas przenieść do nadklasy). Część. W takiej sytuacji, obiekty-części nie mogą być ukryte. Musi być do nich dostęp bezpośredni (nie przez obiekt-całość). Agregacja lub kompozycja implementowane na jeden ze wcześniej poznanych sposobów. Wykorzystanie klasy ObjectPlusPlus zaoszczędzi nam sporo pracy. Modelowanie Systemów Informacyjnych (MSI), wykład 10 24

Realizacja dziedziczenia overlapping (6) o Wykorzystanie agregacji lub kompozycji c.d. Dodatkowe metody: Dające dostęp do atrybutów znajdujących się w obiektach po drugiej stronie agregacji, Dające dostęp do powiązań znajdujących się w obiektach po drugiej stronie agregacji. Modelowanie Systemów Informacyjnych (MSI), wykład 10 25

Realizacja dziedziczenia overlapping (7) public class Osoba extends ObjectPlusPlus { private String imie; private String nazwisko; private Date dataurodzenia; public Osoba(String imie, String nazwisko, Date dataurodzenia) { super();// Wymagane przez ObjectPlusPlus this.imie = imie; this.nazwisko = nazwisko; this.dataurodzenia = dataurodzenia; public Osoba(String imie, String nazwisko, Date dataurodzenia, boolean badanialekarskie) { super();// Wymagane przez ObjectPlusPlus this.imie = imie; this.nazwisko = nazwisko; this.dataurodzenia = dataurodzenia; // "Zmienia" osobe w pracownika dodajpracownika(badanialekarskie); // [ ] Modelowanie Systemów Informacyjnych (MSI), wykład 10 26

Realizacja dziedziczenia overlapping (8) public class Osoba extends ObjectPlusPlus { // [ ] public void dodajpracownika(boolean badanialekarskie) { // Tworzymy czesc opisujaca Pracownika Pracownik p = new Pracownik(badaniaLekarskie); // Dodanie pracownika jako powiazania // (nie korzystamy z dodawania jako czesci w agregacji aby uniknac wyjatku) // Korzystamy z metody dostarczanej przez ObjectPlusPlus this.dodajpowiazanie(nazwarolipracownik, "generalizacja", p); public void dodajemeryta() throws Exception { // Tworzymy czesc opisujaca Pracownika Emeryt e = new Emeryt(); // Dodanie emeryta jako powiazania // (nie korzystamy z dodawania jako czesci w agregacji aby uniknac wyjatku) // Korzystamy z metody dostarczanej przez ObjectPlusPlus this.dodajpowiazanie(nazwaroliemeryt, "generalizacja", e); private static String nazwarolipracownik = "specjalizacjapracownik"; private static String nazwaroliemeryt = "specjalizacjaemeryt"; // [ ] Modelowanie Systemów Informacyjnych (MSI), wykład 10 27

Realizacja dziedziczenia overlapping (9) public class Osoba extends ObjectPlusPlus { // [ ] public boolean czymabadanialekarskie() throws Exception { // daj obiekt opisujacy pracownika try { ObjectPlusPlus[] obj = this.dajpowiazania(nazwarolipracownik); return ((Pracownik) obj[0]).isbadanialekarskie(); catch (Exception e) { // Prawdopodobnie dostalismy wyjatek mowiacy, ze taka rola nie istnieje // (docelowo powinny to byc rozne klasy wyjatkow) throw new Exception("Obiekt nie jest Pracownikiem!"); public int dajnumerindeksu() throws Exception { // daj obiekt opisujacy pracownika try { ObjectPlusPlus[] obj = this.dajpowiazania(nazwarolistudent); return ((Student) obj[0]).getnumerindeksu(); catch (Exception e) { // Prawdopodobnie dostalismy wyjatek mowiacy, ze taka rola nie istnieje // (docelowo powinny to byc rozne klasy wyjatkow) throw new Exception("Obiekt nie jest Studentem!"); Modelowanie Systemów Informacyjnych (MSI), wykład 10 28

Realizacja dziedziczenia overlapping (10) o Wykorzystanie agregacji lub kompozycji c.d. Zalety Łatwość używania (gdy dodamy odpowiednie metody) Korzystamy tylko z tych inwariantów, których rzeczywiście potrzebujemy. Wady Brak możliwości korzystania z konstrukcji związanych z dziedziczeniem, np. przesłanianie metod, polimorficzne wołanie metod, itd. Można to tylko symulować tworząc specjalne, dodatkowe metody. Modelowanie Systemów Informacyjnych (MSI), wykład 10 29

Polimorfizm w dziedziczeniu overlapping o Która wersja metody (z której klasy) powinna być wywołana? Osoba -Imię -Nazwisko -Data urodzenia -/Wiek 1 0..1 Pracownik -Badania lekarskie -Pensja +getpensja() 0..1 Student -Numer indeksu -Stypendium +getstypendium() 0..1 Emeryt -Emerytura +getemerytura() o Chyba żadna Modelowanie Systemów Informacyjnych (MSI), wykład 10 30

Polimorfizm w dziedziczeniu overlapping (2) o Trzeba stworzyć nową metodę, która w zależności od rodzajów(!) obiektów, uwzględni odpowiednie dochody(!) public float getdochody() throws Exception { float dochody = 0.0f; if(this.czysapowiazania(nazwarolipracownik)) { // Jest pracownikiem. Znajdz obiekt opisujacy pracownika. ObjectPlusPlus[] obj = this.dajpowiazania(nazwarolipracownik); // ==> dolicz dochody pracownika dochody += ((Pracownik) obj[0]).getdochody(); if(this.czysapowiazania(nazwarolistudent)) { // Jest studentem. Znajdz obiekt opisujacy studenta. ObjectPlusPlus[] obj = this.dajpowiazania(nazwarolistudent); // ==> dolicz dochody studenta dochody += ((Student) obj[0]).getdochody(); if(this.czysapowiazania(nazwaroliemeryt)) { // Jest emerytem. Znajdz obiekt opisujacy emeryta. // [...] return dochody; Modelowanie Systemów Informacyjnych (MSI), wykład 10 31

Dziedziczenie complete oraz incomplete o Co te rodzaje dziedziczenia znaczą dla diagramu? o Czy coś znaczą dla implementacji? o Nie! o W związku z tym, w przypadku implementacji, ignorujemy te oznaczenia. {incomplete Modelowanie Systemów Informacyjnych (MSI), wykład 10 32

Implementacja wielodziedziczenia o Występuje w języku C++ W przypadku konfliktu nazw używamy operatora zakresu. o Nie występuje w języku Java ani w MS C#. o W związku z tym, w jaki sposób możemy je zaimplementować? Modelowanie Systemów Informacyjnych (MSI), wykład 10 33

Implementacja wielodziedziczenia (2) o Implementujemy je korzystając ze sposobów podanych przy okazji dziedziczenia overlapping: Jedna klasa, Agregacja, kompozycja o Możemy także wykorzystać interfejsy. Modelowanie Systemów Informacyjnych (MSI), wykład 10 34

Implementacja wielodziedziczenia z wykorzystaniem interfejsów o Klasa może implementować dowolną liczbę interfejsów. o Ze względu na ograniczenia interfejsów, korzystamy tylko z metod (brak atrybutów). o Powyższy problem możemy częściowo rozwiązać używając get/set. o Czasami występuje konieczność wielokrotnego implementowania takich samych metod i do tego w ten sam sposób. Modelowanie Systemów Informacyjnych (MSI), wykład 10 35

Implementacja wielodziedziczenia z wykorzystaniem interfejsów (2) Osoba {abstract -Imię -Nazwisko -Data urodzenia -/Wiek Student -Numer indeksu -Stypendium +getstypendium() Pracownik -Badania lekarskie -Pensja +getpensja() Emeryt -Emerytura +getemerytura() Pracujący student Modelowanie Systemów Informacyjnych (MSI), wykład 10 36

Implementacja wielodziedziczenia z wykorzystaniem interfejsów (3) public interface IStudent { public abstract float getdochody(); public abstract float getstypendium(); public abstract void setstypendium(float stypendium); public abstract int getnumerindeksu(); public class PracujacyStudent extends Pracownik implements IStudent { private int numerindeksu; private float stypendium; public PracujacyStudent(String imie, String nazwisko, Date dataurodzenia, boolean badanialekarskie, float pensja, int numerindeksu, float stypendium) { super(imie, nazwisko, dataurodzenia, badanialekarskie, pensja); this.numerindeksu = numerindeksu; this.stypendium = stypendium; public float getstypendium() { return stypendium; public float getdochody() { return super.getdochody() + getstypendium(); public int getnumerindeksu() { return numerindeksu; Jak widać musieliśmy pewne metody (np. getstypendium()) implementować kilka razy (i do tego tak samo). Modelowanie Systemów Informacyjnych (MSI), wykład 10 37

Implementacja wielodziedziczenia z wykorzystaniem interfejsów (4) o Częściowe rozwiązanie problemu wielokrotnej implementacji tych samych metod. Klasa PracującyStudent dziedziczy funkcjonalność pracownika i deleguje funkcjonalność studenta do podłączonego obiektu. Innymi słowy: opakowuje funkcjonalność klasy Student. getstypendium() getnumerindeksu() «interface» IStudent +getstypendium() +getnumerindeksu() 1 Student -Numer indeksu -Stypendium +getstypendium() +getnumerindeksu() Osoba {abstract -Imię -Nazwisko -Data urodzenia -/Wiek Pracownik -Badania lekarskie -Pensja +getpensja() Emeryt -Emerytura +getemerytura() Pracujący student 1 +getstypendium() +getnumerindeksu() Modelowanie Systemów Informacyjnych (MSI), wykład 10 38

Implementacja wielodziedziczenia z wykorzystaniem interfejsów (5) public class PracujacyStudent extends Pracownik implements IStudent { Student student; public PracujacyStudent(String imie, String nazwisko, Date dataurodzenia, boolean badanialekarskie, float pensja, int numerindeksu, float stypendium) { super(imie, nazwisko, dataurodzenia, badanialekarskie, pensja); student = new Student(imie, nazwisko, dataurodzenia, numerindeksu, stypendium); public float getstypendium() { return student.getstypendium(); public void setstypendium(float stypendium) { student.setstypendium(stypendium); public float getdochody() { return super.getdochody() + getstypendium(); public int getnumerindeksu() { return student.getnumerindeksu(); o Pewien niepokój może budzić pamiętanie niektórych atrybutów dwa razy (np. imię, nazwisko): raz w klasie PracujacyStudent,, a drugi raz w podłączonym obiekcie klasy Student. Modyfikacja klasy Student, Przekazanie null i do obiektu klasy Student. Modelowanie Systemów Informacyjnych (MSI), wykład 10 39

Implementacja dziedziczenia wieloaspektowego o Nie występuje bezpośrednio w żadnym popularnym języku programowania (Java, C#, C++). o Trzeba je zaimplementować: Jeden aspekt dziedziczymy używając wbudowanych prostych mechanizmów dziedziczenia danego języka programowania. Pozostałe aspekty: Implementujemy za pomocą jednego z wcześniej omawianych sposobów, Pracownik -Badania lekarskie -Pensja +getpensja() Osoba {abstract -Imię -Nazwisko -Data urodzenia -/Wiek -Numer indeksu -Stypendium +getstypendium() Usuwamy, dodając np. flagi do głównej klasy. Modelowanie Systemów Informacyjnych (MSI), wykład 10 40 Student zajęcie Emeryt -Emerytura +getemerytura() płeć Kobieta -Nazwisko panieńskie +Urodz dziecko() Mężczyzna -służba wojskowa +Idz do wojska()

Implementacja dziedziczenia wieloaspektowego (2) o Który aspekt powinniśmy dziedziczyć? Tam gdzie występuje przesłanianie metod, polimorficzne wołanie, Tam gdzie jest większe zróżnicowanie atrybutów w poszczególnych podklasach. Innymi słowy najbardziej skomplikowaną/rozbudowaną hierarchię. Modelowanie Systemów Informacyjnych (MSI), wykład 10 41

Implementacja dziedziczenia wieloaspektowego (3) o W niektórych sytuacjach, gdy: nie przechowujemy informacji specyficznych dla danego aspektu, a tylko informację o rodzaju obiektu, możemy dziedziczenie zastąpić np. flagą umieszczoną w nadklasie. specyficznych informacji jest mało, możemy je umieścić w nadklasie i również całkowicie zrezygnować z jednego aspektu dziedziczenia. Modelowanie Systemów Informacyjnych (MSI), wykład 10 42

Implementacja dziedziczenia wieloaspektowego (4) o Przykładowe rozwiązanie nr 1 Atrybuty i metody ze zlikwidowanego aspektu umieszczamy w nadklasie. Pracownik -Badania lekarskie -Pensja +getpensja() Osoba -Imię -Nazwisko -Data urodzenia -/Wiek -Płeć -Nazwisko panieńskie [0..1] -Służba wojskowa [0..1] +Urodz dziecko() +Idz do wojska() Student -Numer indeksu -Stypendium +getstypendium() Emeryt -Emerytura +getemerytura() Modelowanie Systemów Informacyjnych (MSI), wykład 10 43

Implementacja dziedziczenia wieloaspektowego (5) o Przykładowe rozwiązanie nr 2 Jedną z hierarchii zastępujemy kompozycją. Pracownik -Badania lekarskie -Pensja +getpensja() Osoba {abstract -Imię -Nazwisko -Data urodzenia -/Wiek Student -Numer indeksu -Stypendium +getstypendium() zajęcie 1 1 Emeryt -Emerytura +getemerytura() Płeć żeńska +Urodz dziecko() Płeć -Nazwisko panieńskie Płeć męska -służba wojskowa +Idz do wojska() Modelowanie Systemów Informacyjnych (MSI), wykład 10 44

Implementacja dziedziczenia dynamicznego o Nie występuje bezpośrednio w żadnym popularnym języku programowania (Java, C#, C++). o Trzeba je zaimplementować: Używając agregacji/kompozycji z ograniczeniem {xor, Umieszczając wszystkie inwarianty w nadklasie i dodając dyskryminator, Sprytnie kopiując obiekty. Modelowanie Systemów Informacyjnych (MSI), wykład 10 45

Implementacja dziedziczenia dynamicznego (2) Wykorzystanie kompozycji Osoba -Imię -Nazwisko -Data urodzenia -/Wiek o Wykorzystujemy kod stworzony +zmienklase() przy okazji dziedziczenia overlapping. 0..1 1 0..1 {XOR 0..1 o Dodatkowo umieszczamy Pracownik Student Emeryt metody ułatwiające zmianę klasy. -Badania lekarskie -Pensja +getpensja() -Numer indeksu -Stypendium +getstypendium() -Emerytura +getemerytura() Modelowanie Systemów Informacyjnych (MSI), wykład 10 46

Implementacja dziedziczenia dynamicznego (3) o Sprytne kopiowanie obiektów Pomysł polega na zastąpieniu starego obiektu, nowym. W tym celu, w każdej z podklas tworzymy dodatkowe konstruktory, Każdy z nich przyjmuje jako parametr referencję do obiektu nadklasy (plus ewentualnie dodatkowe informacje specyficzne dla określonej klasy), Informacje wspólne dla wszystkich obiektów znajdujących się na danym poziomie hierarchii są kopiowane z wnętrza otrzymanego obiektu do wnętrza nowotworzonego obiektu. Modelowanie Systemów Informacyjnych (MSI), wykład 10 47

Implementacja dziedziczenia dynamicznego (4) o Sprytne kopiowanie obiektów c. d. Problemem może być uaktualnienie odpowiednich referencji prowadzących do starego obiektu tak, aby pokazywały na nowy obiekt. Odpowiednie referencje oznaczają te, które są wspólne dla starej i nowej klasy. Pozostałe referencje (te specyficzne dla starej klasy) przepadają podobnie jak wartości atrybutów. W przypadku korzystania z ObjectPlusPlus,, rozwiązanie zanie tego problemu jest dużo łatwiejsze. Jest tak dlatego, że posiadamy informacje o obiektach, które na nas pokazują bo wszystkie powiązania w ObjectPlusPlus są dwustronne! Trzeba również pamiętać o zadbaniu o ekstensję! Modelowanie Systemów Informacyjnych (MSI), wykład 10 48

Implementacja dziedziczenia dynamicznego (5) o Sprytne kopiowanie obiektów c. d. public abstract class Osoba { protected String imie; protected String nazwisko; protected Date dataurodzenia; // [ ] public String tostring() { return this.getclass().getsimplename() + ": " + imie + " " + nazwisko; public class Pracownik extends Osoba { private boolean badanialekarskie; private float pensja; // [ ] public Pracownik(Osoba poprzedniaosoba, boolean badanialekarskie, float pensja) { // Skopiowanie "starych" danych super(poprzedniaosoba.imie, poprzedniaosoba.nazwisko, poprzedniaosoba.dataurodzenia); // Zapamietanie nowych this.badanialekarskie = badanialekarskie; this.pensja = pensja; Modelowanie Systemów Informacyjnych (MSI), wykład 10 49

Implementacja dziedziczenia dynamicznego (6) o Sprytne kopiowanie obiektów c. d. // Tworzymy studenta Osoba o1 = new Student("Jan", "Kowalski", new Date(), 1212, 2000.0f); System.out.println(o1); // Tworzymy pracownika na podstawie studenta o1 = new Pracownik(o1, true, 4000.0f); System.out.println(o1); // Tworzymy emeryta na podstawie pracownika o1 = new Emeryt(o1, 3000.0f); System.out.println(o1); Student: Jan Kowalski Pracownik: Jan Kowalski Emeryt: Jan Kowalski Modelowanie Systemów Informacyjnych (MSI), wykład 10 50

Implementacja dziedziczenia dynamicznego (7) o Sprytne kopiowanie obiektów c. d. Trzeba jeszcze zadbać o: zamianę referencji pokazujących na nasz nowy obiekt, usunięcie starego obiektu z ekstensji. W przypadku korzystania z ObjectPlusPlus wymagane informacje są już przechowywane w systemie. Trzeba tylko dodać kilka metod, które całą operację zautomatyzują. Praca domowa dla chętnych? Modelowanie Systemów Informacyjnych (MSI), wykład 10 51

Zalety i wady poszczególnych rozwiązań Wszystkie rodzaje dziedziczenia, można obejść za pomocą jednej lub kilku poniższych technik: o Zastąpienie hierarchii za pomocą jednej klasy Łatwość implementacji. Czasami pozorna, np. trzeba zastąpić przesłanianie metod za pomocą np. case ów lub if ów. Względna łatwość użycia. Nieoptymalne wykorzystanie zasobów. Modelowanie Systemów Informacyjnych (MSI), wykład 10 52

Zalety i wady poszczególnych rozwiązań (2) o Wykorzystanie agregacji/kompozycji Optymalne wykorzystanie zasobów, Dość pracochłonna implementacja (m. in. metody opakowujące ), chociaż niezbyt trudna. o Zastosowanie interfejsów Dość duża pracochłonność, Można ją zmniejszyć używając agregacji i/oraz propagacji operacji. Duże możliwości. Modelowanie Systemów Informacyjnych (MSI), wykład 10 53

o W Podsumowanie popularnych językach programowania tylko najprostszy rodzaj dziedziczenia. występuje o Wszystkie inne trzeba zaimplementować korzystając z różnych konstrukcji. przeciwieństwie do asocjacji, nie ma jednego idealnego rozwiązania. Każdy przypadek powinien być traktowany indywidualnie. o W o Wszystkie omówione sposoby są obejściem dziedziczenia, a nie konstrukcjami równoważnymi. o W związku z powyższym, tam gdzie się tylko da, należy korzystać z dziedziczenia, a nie jego substytutów. Modelowanie Systemów Informacyjnych (MSI), wykład 10 54