Wykład 12 Marcin Młotkowski 16 maja 2018
Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 482 / 537
Dziedziczenie Dziedziczenie a składanie Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 483 / 537
Dziedziczenie Dziedziczenie a składanie Kiedy dziedziczyć Wskazówka Podklasa przedefiniowuje operację nadklasy lub dodaje nową funkcjonalność Marcin Młotkowski 484 / 537
Dziedziczenie Dziedziczenie a składanie Zły przykład class ListaJednokier { Object obj; ListaJednokier nast; void dodaj(object obj); } class ListaDwukier : ListaJednokier { ListaDwukier poprz; ListaDwukier nast; void dodaj (Object obj); // na początek void nakoniec (Object obj); // na koniec } Marcin Młotkowski 485 / 537
Dziedziczenie Dziedziczenie a składanie Analiza przykładu Klasa ListaDwukier ma zupełnie inną implementację niż klasa ListaJednokier, nie korzysta ani z odziedziczonych pól, ani z odziedziczonych metod. Klasy ListaDwukier i ListaJednokier mają podobne interfejsy. Marcin Młotkowski 486 / 537
Dziedziczenie Dziedziczenie a składanie Morał Identyczny interfejs nie musi implikować dziedziczenia. Przesłanką do dziedziczenia jest wykorzystanie implementacji z nadklasy (dziedziczenie implementacji) i rozszerzenie funkcjonalności Marcin Młotkowski 487 / 537
Dziedziczenie Dziedziczenie a składanie Co z tym zrobić Wspólna klasa abstrakcyjna abstract class ListaAbstrakcyjna { void public dodaj(object obj); } Wspólny interfejs interface ILista { void dodaj(object obj); } Marcin Młotkowski 488 / 537
Dziedziczenie Dziedziczenie a składanie Przypomnienie Klasy powinne mieć precyzyjnie określone zadanie. W przypadku "szerokiej" funkcjonalności klasy lepiej poskładać ją z mniejszych. Marcin Młotkowski 489 / 537
Dziedziczenie Dziedziczenie a składanie Przykład Wersja prosta class osoba { string Imie, Nazwisko; public void edycja() {... } public void odczyt() {... } public void zapis() {... } } Bardziej uniwersalna class osoba { string Imie, Nazwisko; Edytor e = new EdytorQt(); BazaDanych bd = new BSDQLite(); } Marcin Młotkowski 490 / 537
Dziedziczenie Dziedziczenie a składanie Wzorce projektowe Poznane wzorce Singleton MVC Szablon i Strategia Marcin Młotkowski 491 / 537
Dziedziczenie Dziedziczenie a składanie Wzorce projektowe Poznane wzorce Singleton MVC Szablon i Strategia Źródło wzorców Wzorce projektowe, E. Gamma, R. Helm, R. Johnson, J. Vlissides Marcin Młotkowski 491 / 537
Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 492 / 537
* obiektowe Analiza obiektowa Analiza obiektowa Projektowanie obiektowe Marcin Młotkowski 493 / 537
Implementacja klas wskazanych w analizie Implementacja związków Uszczegółowienie, tj. dodanie klas Marcin Młotkowski 494 / 537
Analiza obiektowa Klasa Podklasa InnaPodklasa Marcin Młotkowski 495 / 537
Implementacja schematu Dziedziczenie abstract class Klasa {... } class Podklasa : Klasa {... } class InnaPodklasa : Klasa {... } Marcin Młotkowski 496 / 537
Bardziej skomplikowane zadanie Osoba Pracownik Czytelnik PracownikCzytelnik Marcin Młotkowski 497 / 537
Implementacja Analiza obiektowa Implementować w języku posiadającym wielodziedziczenie: Python, C++. Marcin Młotkowski 498 / 537
Spłaszczenie hierarchii Osoba Pracownik Czytelnik PracownikCzytelnik Marcin Młotkowski 499 / 537
Podział na role Analiza obiektowa Osoba Role Pracownik Czytelnik Marcin Młotkowski 500 / 537
Agregacja przypomnienie Zamówienie PozycjaZamówienia 1 0..* Marcin Młotkowski 501 / 537
Kolekcje Kolekcje pojawiają się jako dodatkowe klasy, nieuwzględniony w ogólnym projekcie Kolekcje są obecne w większości (wszystkich?) liczących się środowiskach programistycznych Marcin Młotkowski 502 / 537
Samodzielna implementacja kolekcji, 1. podejście class Osoba { String Nazwisko; Osoba następnik; void dołącz(osoba o) {... } } Marcin Młotkowski 503 / 537
Samodzielna implementacja kolekcji, 1. podejście class Osoba { String Nazwisko; Osoba następnik; void dołącz(osoba o) {... } } Ocena implementacji Klasa łączy funkcje listy i Osoby Wymaga implementacji mechanizmów listowych dla każdej klasy osobno Kłopot z listą pustą Marcin Młotkowski 503 / 537
Implementacja kolekcji, 2. podejście class Lista { Osoba val; Lista następnik; void dołącz(osoba o){... } } Marcin Młotkowski 504 / 537
Implementacja kolekcji, 2. podejście class Lista { Osoba val; Lista następnik; void dołącz(osoba o){... } } Ocena implementacji Klasa Osoba jest czystą klasą Kłopot listą pustą Marcin Młotkowski 504 / 537
Implementacja kolekcji, 3. podejście class Lista { ElemListy lista; bool empty(); void dołącz(osoba o); } class ElemListy { Osoba val; ElemListy następnik; } Marcin Młotkowski 505 / 537
Ocena implementacji Zalety Klasy mają dokładnie określone zadania Klasę Lista można wykorzystywać do przechowywania obiektów innych klas Wady Rośnie liczba klas i zależności między nimi. Marcin Młotkowski 506 / 537
Implementacja związków między obiektami Poprzez referencje Utworzenie nowej klasy reprezentującej związek Marcin Młotkowski 507 / 537
Przykład Analiza obiektowa Małżeństwo Prosty system zwykła referencja Marcin Młotkowski 508 / 537
Przykład Analiza obiektowa Małżeństwo Prosty system zwykła referencja Urząd Stanu Cywilnego Żona Ślub + datazawarcia + świadkowie + symb_dokum Mąż Marcin Młotkowski 508 / 537
Skąd się jeszcze biorą obiekty Przechowywanie danych Interfejsy użytkownika Aplikacja jako obiekt (singleton)... Marcin Młotkowski 509 / 537