13.07.2015 Views

Modelowanie Systemów Informacyjnych (MSI) - pjwstk

Modelowanie Systemów Informacyjnych (MSI) - pjwstk

Modelowanie Systemów Informacyjnych (MSI) - pjwstk

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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


Klasa abstrakcyjnao Klasa, która nie może mieć bezpośrednichwystąpień.o Wykorzystywana do tworzenia hierarchiidziedziczenia.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 4


Problem biznesowy (2)o Najprostszym sposobem wydaje sięumieszczenie atrybutów w poszczególnychklasach i dodanie odpowiednich metodo W zależności od rodzajuosoby, wywołamyodpowiedniąmetodę.o Jakiś lepszysposób?<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 6


Polimorficzne wołanie metodo Wykorzystuje przesłanianie.o Umożliwia wykonywanie operacji bez„ręcznego” sprawdzania konkretnego rodzajuobiektu.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 7


Metody abstrakcyjneo Jaki kod będzie znajdował się w metodziegetDochody()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.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 8


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


Pozostałe rodzaje dziedziczenia (4)o Wielodziedziczenie (dziedziczeniewielokrotne, multi-inheritanceinheritance) – c. d.:Problemy,Idealne rozwiązanie?Co z przesłanianiem i polimorficznym wołaniemmetod?<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 12


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


Dziedziczenie, a obiektowe języki programowaniao W większości przypadków, popularne językiprogramowania posiadają najprostszy rodzajdziedziczenia: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?<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 15


Realizacja dziedziczenia disjointo Ten typ dziedziczenia występujebezpośrednio w popularnych językachprogramowania.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 {}<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 16


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


Wykorzystanie polimorficznego wołania metod (2)oSposó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;}}oPozostałe klasy są zaimplementowane analogicznie do powyższych.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 18


Wykorzystanie polimorficznego wołania metod (3)oTworzymy dwa obiekty:Pracownika,Studenta.o Traktujemy je po prostu jako osoby (referencja dotypu osoba)o Każdą z nich pytamy o dochody (bez sprawdzania zjaką klasą mamy do czynienia).o Dzięki polimorficznemu wołaniu metody, dostajemyodpowiedzi właściwe dla poszczególnych rodzajówosó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.02000.0<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 19


Realizacja dziedziczenia overlappingo Ten typ dziedziczenia nie występujebezpośrednio w popularnych językachprogramowania.o Sposoby obejścia:Zastąpienie całej hierarchii dziedziczenia jednąklasą,Wykorzystanie agregacjilub kompozycji,Rozwiązania łączącepowyższe metody.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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 rodzajuobiektu (używamy EnumSet ponieważ chcemyprzechowywać 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 + Studentprivate EnumSet rodzajOsoby = EnumSet.of(OsobaRodzaj.Osoba);<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 21


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


Realizacja dziedziczenia overlapping (4)o Wykorzystanie agregacji lub kompozycjiOsoba-Imię-Nazwisko-Data urodzenia-/Wiek+getDochody()10..1Pracownik-Badania lekarskie-Pensja+getPensja()+getDochody()0..1Student-Numer indeksu-Stypendium+getStypendium()+getDochody()0..1Emeryt-Emerytura+getEmerytura()+getDochody()<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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 przezobiekt-całość).Agregacja lub kompozycja implementowane najeden ze wcześniej poznanych sposobów.Wykorzystanie klasy ObjectPlusPluszaoszczędzi nam sporo pracy.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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ę wobiektach „po drugiej stronie” agregacji,• Dające dostęp do powiązań znajdujących się wobiektach „po drugiej stronie” agregacji.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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 ObjectPlusPlusthis.imie = imie;this.nazwisko = nazwisko;this.dataUrodzenia = dataUrodzenia;}// "Zmienia" osobe w pracownikadodajPracownika(badaniaLekarskie);// […]<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 26


Realizacja dziedziczenia overlapping (8)public class Osoba extends ObjectPlusPlus {// […]public void dodajPracownika(boolean badaniaLekarskie) {// Tworzymy czesc opisujaca PracownikaPracownik p = new Pracownik(badaniaLekarskie);}// Dodanie pracownika jako powiazania// (nie korzystamy z dodawania jako czesci w agregacji aby uniknac wyjatku)// Korzystamy z metody dostarczanej przez ObjectPlusPlusthis.dodajPowiazanie(nazwaRoliPracownik, "generalizacja", p);public void dodajEmeryta() throws Exception {// Tworzymy czesc opisujaca PracownikaEmeryt e = new Emeryt();}// Dodanie emeryta jako powiazania// (nie korzystamy z dodawania jako czesci w agregacji aby uniknac wyjatku)// Korzystamy z metody dostarczanej przez ObjectPlusPlusthis.dodajPowiazanie(nazwaRoliEmeryt, "generalizacja", e);private static String nazwaRoliPracownik = "specjalizacjaPracownik";private static String nazwaRoliEmeryt = "specjalizacjaEmeryt";// […]<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 27


Realizacja dziedziczenia overlapping (9)public class Osoba extends ObjectPlusPlus {// […]public boolean czyMaBadaniaLekarskie() throws Exception {// daj obiekt opisujacy pracownikatry {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 pracownikatry {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!");}}<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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órychrzeczywiście potrzebujemy.Wady• Brak możliwości korzystania z konstrukcji związanychz dziedziczeniem, np. przesłanianie metod,polimorficzne wołanie metod, itd. Można to tylkosymulować tworząc specjalne, dodatkowe metody.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 29


Polimorfizm w dziedziczeniu overlappingo Która wersja metody (z której klasy) powinnabyć wywołana?Osoba-Imię-Nazwisko-Data urodzenia-/Wiek+getDochody()10..1Pracownik-Badania lekarskie-Pensja+getPensja()+getDochody()0..1Student-Numer indeksu-Stypendium+getStypendium()+getDochody()0..1Emeryt-Emerytura+getEmerytura()+getDochody()o Chyba żadna…<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 30


Polimorfizm w dziedziczeniu overlapping (2)oTrzeba stworzyć nową metodę, która w zależności odrodzajó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 pracownikadochody += ((Pracownik) obj[0]).getDochody();}if(this.czySaPowiazania(nazwaRoliStudent)) {// Jest studentem. Znajdz obiekt opisujacy studenta.ObjectPlusPlus[] obj = this.dajPowiazania(nazwaRoliStudent);// ==> dolicz dochody studentadochody += ((Student) obj[0]).getDochody();}}if(this.czySaPowiazania(nazwaRoliEmeryt)) {// Jest emerytem. Znajdz obiekt opisujacy emeryta.// [...]}return dochody;<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 31


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


Implementacja wielodziedziczeniao Występuje w języku C++W przypadku konfliktu nazw używamy operatorazakresu.o Nie występuje w języku Javaani w MS C#.o W związku z tym, w jakisposób możemy jezaimplementować?<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 33


Implementacja wielodziedziczenia (2)o Implementujemy je korzystając ze sposobówpodanych przy okazji dziedziczeniaoverlapping:Jedna klasa,Agregacja, kompozycjao Możemy także wykorzystać interfejsy.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 34


Implementacja wielodziedziczenia z wykorzystanieminterfejsówo 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ęścioworozwiązać używając get/set.o Czasami występuje koniecznośćwielokrotnego implementowania takichsamych metod i do tego w ten sam sposób.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 35


Implementacja wielodziedziczenia z wykorzystanieminterfejsów (2)Osoba{abstract}-Imię-Nazwisko-Data urodzenia-/Wiek+getDochody()Student-Numer indeksu-Stypendium+getStypendium()+getDochody()Pracownik-Badania lekarskie-Pensja+getPensja()+getDochody()Emeryt-Emerytura+getEmerytura()+getDochody()Pracujący student<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 36


Implementacja wielodziedziczenia z wykorzystanieminterfejsó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, booleanbadaniaLekarskie, 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 pewnemetody (np. getStypendium())implementować kilka razy (i dotego tak samo).<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 37


Implementacja wielodziedziczenia z wykorzystanieminterfejsów (4)oCzęściowe rozwiązanie problemu wielokrotnej implementacjitych samych metod.Klasa PracującyStudentdziedziczy funkcjonalnośćpracownika i delegujefunkcjonalność studentado podłączonego obiektu.Innymi słowy: opakowujefunkcjonalność klasyStudent.getStypendium()getNumerIndeksu()«interface»IStudent+getStypendium()+getDochody()+getNumerIndeksu()1Student-Numer indeksu-Stypendium+getStypendium()+getDochody()+getNumerIndeksu()Osoba{abstract}-Imię-Nazwisko-Data urodzenia-/Wiek+getDochody()Pracownik-Badania lekarskie-Pensja+getPensja()+getDochody()Emeryt-Emerytura+getEmerytura()+getDochody()Pracujący student1+getStypendium()+getDochody()+getNumerIndeksu()<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 38


Implementacja wielodziedziczenia z wykorzystanieminterfejsów (5)public class PracujacyStudent extends Pracownik implements IStudent {Student student;public PracujacyStudent(String imie, String nazwisko, Date dataUrodzenia, booleanbadaniaLekarskie, 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();}}oPewien niepokój może budzić pamiętanie niektórych atrybutów dwa razy(np. imię, nazwisko): raz w klasie PracujacyStudent, , a drugi raz wpodłączonym obiekcie klasy Student.Modyfikacja klasy Student,Przekazanie null’ido obiektu klasy Student.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 39


Implementacja dziedziczenia wieloaspektowegoo Nie występuje bezpośrednio w żadnym popularnymjęzyku programowania (Java, C#, C++).o Trzeba je zaimplementować:Jeden aspekt dziedziczymy używając wbudowanychprostych mechanizmów dziedziczenia danego językaprogramowania.Pozostałe aspekty:• Implementujemy zapomocą jednegoz wcześniejomawianychsposobów,Pracownik-Badania lekarskie-Pensja+getPensja()+getDochody()Osoba{abstract}-Imię-Nazwisko-Data urodzenia-/Wiek+getDochody()-Numer indeksu-Stypendium+getStypendium()+getDochody()• Usuwamy, dodając np. flagi do głównej klasy.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 40StudentzajęcieEmeryt-Emerytura+getEmerytura()+getDochody()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óww poszczególnych podklasach.Innymi słowy – najbardziejskomplikowaną/rozbudowaną hierarchię.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 41


Implementacja dziedziczenia wieloaspektowego (3)o W niektórych sytuacjach, gdy:nie przechowujemy informacji specyficznych dladanego aspektu, a tylko informację o rodzajuobiektu, możemy dziedziczenie zastąpić np. flagąumieszczoną w nadklasie.specyficznych informacji jest mało, możemy jeumieścić w nadklasie i również całkowiciezrezygnować z jednego aspektu dziedziczenia.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 42


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


Implementacja dziedziczenia wieloaspektowego (5)o Przykładowe rozwiązanie nr 2Jedną z hierarchiizastępujemykompozycją.Pracownik-Badania lekarskie-Pensja+getPensja()+getDochody()Osoba{abstract}-Imię-Nazwisko-Data urodzenia-/Wiek+getDochody()Student-Numer indeksu-Stypendium+getStypendium()+getDochody()zajęcie1 1Emeryt-Emerytura+getEmerytura()+getDochody()Płeć żeńska+Urodz dziecko()Płeć-Nazwisko panieńskiePłeć męska-służba wojskowa+Idz do wojska()<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 44


Implementacja dziedziczenia dynamicznegoo Nie występuje bezpośrednio w żadnympopularnym języku programowania (Java, C#,C++).o Trzeba je zaimplementować:Używając agregacji/kompozycjiz ograniczeniem {xor},Umieszczając wszystkieinwarianty w nadklasiei dodając dyskryminator,„Sprytnie” kopiując obiekty.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 45


Implementacja dziedziczenia dynamicznego (2)Wykorzystanie kompozycjiOsoba-Imię-Nazwisko-Data urodzenia-/WiekoWykorzystujemy kod stworzony+getDochody()+zmienKlase()przy okazji dziedziczeniaoverlapping.0..110..1{XOR}0..1oDodatkowo umieszczamyPracownikStudentEmerytmetody ułatwiające„zmianę klasy”.-Badania lekarskie-Pensja+getPensja()+getDochody()-Numer indeksu-Stypendium+getStypendium()+getDochody()-Emerytura+getEmerytura()+getDochody()<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 46


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


Implementacja dziedziczenia dynamicznego (4)o „Sprytne” kopiowanie obiektów – c. d.Problemem może być uaktualnienie odpowiednichreferencji prowadzących do „starego” obiektu tak, abypokazywały na nowy obiekt.• „Odpowiednie” referencje oznaczają te, które są wspólnedla „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ązanietego problemu jest dużo łatwiejsze. Jest tak dlatego, żeposiadamy 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ę!<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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" danychsuper(poprzedniaOsoba.imie, poprzedniaOsoba.nazwisko,poprzedniaOsoba.dataUrodzenia);}// Zapamietanie nowychthis.badaniaLekarskie = badaniaLekarskie;this.pensja = pensja;<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 49


Implementacja dziedziczenia dynamicznego (6)o„Sprytne” kopiowanie obiektów – c. d.// Tworzymy studentaOsoba o1 = new Student("Jan", "Kowalski", new Date(), 1212, 2000.0f);System.out.println(o1);// Tworzymy pracownika na podstawie studentao1 = new Pracownik(o1, true, 4000.0f);System.out.println(o1);// Tworzymy emeryta na podstawie pracownikao1 = new Emeryt(o1, 3000.0f);System.out.println(o1);Student: Jan KowalskiPracownik: Jan KowalskiEmeryt: Jan Kowalski<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), 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 wymaganeinformacje są już przechowywane w systemie. Trzebatylko dodać kilka metod, które całą operacjęzautomatyzują.Praca domowa dla chętnych?<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 51


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


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


o WPodsumowaniepopularnychjęzykachprogramowaniatylko najprostszy rodzaj dziedziczenia.występujeo Wszystkie inne trzeba zaimplementować korzystając zróżnych konstrukcji.przeciwieństwiedoasocjacji,nie majednegoidealnego rozwiązania. Każdy przypadek powinien byćtraktowany indywidualnie.o Wo Wszystkieomówionesposobysąobejściemdziedziczenia, a nie konstrukcjami równoważnymi.o W związku z powyższym, tam gdzie się tylko da,należykorzystać z dziedziczenia, a nie jegosubstytutów.<strong>Modelowanie</strong> Systemów <strong>Informacyjnych</strong> (<strong>MSI</strong>), wykład 10 54

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!