Programowanie i projektowanie obiektowe

Podobne dokumenty
Programowanie obiektowe

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

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

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Polimorfizm. dr Jarosław Skaruz

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Programowanie obiektowe - 1.

Paweł Kurzawa, Delfina Kongo

Programowanie obiektowe

Programowanie obiektowe

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Aplikacje w środowisku Java

Wzorce projektowe. dr inż. Marcin Pietroo

Programowanie i projektowanie obiektowe

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

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

Programowanie obiektowe

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

Wstęp do programowania

Enkapsulacja, dziedziczenie, polimorfizm

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Dziedziczenie. Tomasz Borzyszkowski

Mechanizm dziedziczenia

Programowanie obiektowe

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Podstawy programowania w Pythonie

Programowanie obiektowe

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

Modelowanie i Programowanie Obiektowe

Programowanie i projektowanie obiektowe

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Abstrakcyjny typ danych

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


PHP 5 język obiektowy

Programowanie współbieżne i rozproszone

Dokumentacja do API Javy.

Programowanie Obiektowe i C++ Marcin Benke

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

Język C++ Programowanie obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Programowanie Obiektowe i C++

Programowanie obiektowe

Zaawansowany kurs języka Python

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

Programowanie obiektowe

Zaawansowane programowanie obiektowe - wykład 5

Podstawy Programowania Obiektowego

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33

Wykład 8: klasy cz. 4

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

Szablony funkcji i klas (templates)

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Język Java część 2 (przykładowa aplikacja)

Wstęp do programowania

Technologia Programowania 2016/2017 Wykład 5

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

Dziedziczenie. Zadanie 1

Paradygmaty programowania

Metaprogramowanie w Ruby

Projektowanie obiektowe. Roman Simiński Polimorfizm

Zaawansowany kurs języka Python

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

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

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

Diagramy klas. dr Jarosław Skaruz

Kurs rozszerzony języka Python

Wykład 6: Dziedziczenie

Template method (metoda szablonowa)

TEMAT : KLASY DZIEDZICZENIE

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe

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

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Wywoływanie metod zdalnych

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

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

Język Java część 2 (przykładowa aplikacja)

Programowanie obiektowe

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Programowanie obiektowe

problem w określonym kontekście siły istotę jego rozwiązania

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

Wzorce projektowe. dr inż. Marcin Pietroo

Wprowadzenie do szablonów szablony funkcji

Programowanie i projektowanie obiektowe

Wprowadzenie do szablonów szablony funkcji

Transkrypt:

Programowanie i projektowanie obiektowe Metody i dziedziczenie Paweł Daniluk Wydział Fizyki Jesień 2015 P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 1 / 31

Metody Przypomnienie Obiekty odpowiadają za przechowywanie informacji. W klasach definiuje się odpowiedzialność za funkcjonalności. Metoda to funkcja zdefiniowana w klasie i operująca na obiekcie, dla którego została wywołana (i dodatkowych argumentach). P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 2 / 31

Metody Przypomnienie Obiekty odpowiadają za przechowywanie informacji. W klasach definiuje się odpowiedzialność za funkcjonalności. Metoda to funkcja zdefiniowana w klasie i operująca na obiekcie, dla którego została wywołana (i dodatkowych argumentach). Uwaga W niektórych językach programowania używa się pojęcia komunikatu. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 2 / 31

Metody c.d. Co mogą robić metody? zmiana i pobieranie właściwości obiektu (kapsułkowanie) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 3 / 31

Metody c.d. Co mogą robić metody? zmiana i pobieranie właściwości obiektu (kapsułkowanie) pobieranie przetworzonych właściwości obiektu P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 3 / 31

Metody c.d. Co mogą robić metody? zmiana i pobieranie właściwości obiektu (kapsułkowanie) pobieranie przetworzonych właściwości obiektu zmiana właściwości w wyniku obliczenia P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 3 / 31

Metody c.d. Co mogą robić metody? zmiana i pobieranie właściwości obiektu (kapsułkowanie) pobieranie przetworzonych właściwości obiektu zmiana właściwości w wyniku obliczenia obliczenie funkcji z dodatkowymi argumentami wynikającymi ze stanu obiektu P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 3 / 31

Metody c.d. Co mogą robić metody? zmiana i pobieranie właściwości obiektu (kapsułkowanie) pobieranie przetworzonych właściwości obiektu zmiana właściwości w wyniku obliczenia obliczenie funkcji z dodatkowymi argumentami wynikającymi ze stanu obiektu wykonanie operacji na innym obiekcie P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 3 / 31

Metody c.d. Co mogą robić metody? zmiana i pobieranie właściwości obiektu (kapsułkowanie) pobieranie przetworzonych właściwości obiektu zmiana właściwości w wyniku obliczenia obliczenie funkcji z dodatkowymi argumentami wynikającymi ze stanu obiektu wykonanie operacji na innym obiekcie kaskada wywołań/zdarzeń P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 3 / 31

Operacje na właściwościach Kapsułkowanie side Square +set_side(side) +get_side() a,b,c Quadratic +set_abc(a,b,c) +get_abc() Przetworzone właściwości Square +get_area() +get_perimeter() Quadratic +get_solutions() P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 4 / 31

Obliczenia Funkcje Square side position +covers(x,y) a,b,c Quadratic +intersects(curve) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 5 / 31

Operacje na innym obiekcie Wywołanie metody obiektu może powodować wywołanie metod innych (np. przekazanych jako argumenty) obiektów. Przykład c l a s s T r e s e r : def nakarm ( s e l f, lew ) : pasza=s e l f. p r z y g o t u j _ p a s z e ( ) lew. j e d z ( pasza ) c l a s s Lew : def j e d z ( s e l f, pasza ) : p r i n t "Mniam, pyszna ", pasza P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 6 / 31

Kaskada wywołań Wywołanie metody może pociągać za sobą zaplanowaną serię kolejnych wywołań. next next next main: a:element b:element c:element d:element find(val) alt [val self.val] find(val) alt [val self.val] find(val) alt [val self.val] find(val) d d d d P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 7 / 31

Przykład main: chlop: kuryto: jest w kurnik: mieszka w kura1:kura kura2:kura obrzadz(kurnik) get_kuryto() kuryto wypelnij(ziarno) nasypano() jedz(kuryto) jedz(kuryto) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 8 / 31

Observer Przedstawiony na poprzednim slajdzie schemat jest nienaturalny. Kury powinny obserwować koryto. Wzorzec Observer pozwala na rejestrowanie obiektów, które powinny być informowane (klasa Observer) w obiekcie obserwowanym (klasa Subject). Wywołanie metody notifyobservers powoduje wywołanie metody notify u wszystkich obserwatorów. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 9 / 31

Dziedziczenie Podklasa dziedziczy składowe nadklasy. Jeśli jest to konieczne, może je przedefiniować. Zastosowania rozszerzenie istniejącej klasy o nowe funkcjonalności (uszczegółowienie) grupowanie klas o wspólnych funkcjonalnościach oznaczenie przynależności do wspólnej, nadrzędnej kategorii P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 10 / 31

Rozszerzenie o nowe funkcjonalności Przykład Lew GroznyLew NaprawdeGroznyLew +rycz() +nastrasz(obiekt) +pożryj(obiekt) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 11 / 31

Grupowanie ze względu na funkcjonalności Przykład Kotowaty +drap() Lew Kot +rycz(obiekt) +mrucz() P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 12 / 31

Przynależność do jednej kategorii Przykład Zwierzę +żeruj(terytorium) Śledź Mól +żeruj(akwen) +żeruj(szafa) Mówimy, że klasa Zwierzę jest klasą abstrakcyjną. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 13 / 31

Uwaga o typowaniu Typowanie statyczne (Java, C++) Stosowanie klas abstrakcyjnych jest konieczne, jeżeli ma istnieć możliwość operowania w tym samym kontekście na obiektach różnych klas, które nie mają naturalnej (obejmującej wspólną funkcjonalność) nadklasy. Występowanie wymaganych składowych jest weryfikowane na etapie kompilacji. Typowanie dynamiczne (duck-typing) (Python, Smalltalk) Klasy abstrakcyjne nie są konieczne, ponieważ dowolne obiekty mogą występować we wszystkich kontekstach. Jeżeli nie posiadają wymaganych składowych zostanie to wykryte dopiero podczas wykonania programu. Jednakowoż stosowanie klas abstrakcyjnych ułatwia projektowanie i późniejsze utrzymanie kodu. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 14 / 31

Przysłanianie metod Metoda zdefiniowana w podklasie przesłania tę zdefiniowaną w nadklasie. Możliwe są dwie strategie: metoda z nadklasy jest nieużywana w podklasie metoda z nadklasy jest wywoływana w podklasie Python Metody, których nazwa jest poprzedzona prefiksem nie są przysłanialne. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 15 / 31

Przysłanianie metod c.d. Przykład c l a s s Student : def odpowiedz ( s e l f, p y t a n i e ) : s e l f. zrob_karpia ( ) s e l f. dukaj ( p y t a n i e ) c l a s s DobryStudent ( Student ) : def odpowiedz ( s e l f, p y t a n i e ) : s e l f. odpowiedz_spiewajaco ( p y t a n i e ) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 16 / 31

Przysłanianie metod c.d. Przykład c l a s s Lew : def p o z r y j ( s e l f, a n t y l o p a ) : p r i n t "Mniam. " c l a s s GroznyLew ( Lew ) : def p o z r y j ( s e l f, a n t y l o p a ) : s e l f. r y c z ( ) Lew. p o z r y j ( s e l f, a n t y l o p a ) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 17 / 31

Klasy abstrakcyjne Czasem zachodzi potrzeba zdefiniowania metody, która musi zostać przysłonięta (w językach z typowaniem statycznym jest to standardem). Obiekty klasy, która zawiera taką metodą, nie powinny być tworzone. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 18 / 31

Klasy abstrakcyjne c.d. W Pythonie c l a s s Animal ( ) : def speak ( s e l f ) : r a i s e NotImplementedError #a b s t r a c t c l a s s Dog( Animal ) : def speak ( s e l f ) : return " bark " c l a s s MuteAnimal ( Animal ) : pass Nieme zwierzę można stworzyć. Próba wywołania metody speak zakończy się wyjątkiem. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 19 / 31

Klasy abstrakcyjne c.d. W Pythonie from abc import ABCMeta, a b s t r a c t m e t h o d c l a s s Animal ( ) : metaclass = ABCMeta @abstractmethod def speak ( s e l f ) : pass c l a s s MuteAnimal ( Animal ) : pass c l a s s Dog( Animal ) : def speak ( s e l f ) : p r i n t " Bark " P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 20 / 31

>>> Animal() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can t instantiate abstract class Animal with abstract methods speak >>> MuteAnimal() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Can t instantiate abstract class MuteAnimal with abstract methods speak >>> Dog() < main.dog object at 0x10ade20d0> P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 21 / 31

Kiedy warto rozszerzyć klasę? Podklasę tworzymy, jeżeli: wszystkie składowe nadklasy zostaną wykorzystane lub przysłonięte w użyteczny sposób, obiekt podklasy ma udawać (być używany tak samo jak) obiekt nadklasy. Jeżeli żaden z powyższych warunków nie jest spełniony (czyli np. zachodzi konieczność przysłonięcia wielu metod w sposób trywialny), należy stworzyć wspólną nadklasę. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 22 / 31

Kiedy warto rozszerzyć klasę? c.d. Dobrze List +get_first() +get_last() +append(val) SortableList +sort() SortedList +append(val) Metoda sort w klasie SortedList mogłaby być prywatna. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 23 / 31

Kiedy warto rozszerzyć klasę? c.d. Źle +name Node +operation() +add_child() +remove_child() +common() Leaf +add_child() «empty» +remove_child() «empty» +operation() P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 24 / 31

Dobrze AbstractNode +name +operation() +common() Leaf +operation() Node +operation() +add_child() +remove_child() P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 25 / 31

Jak projektować hierarchie klas Klasy dziedziczące po sobie powinny spełniać warunki podane wcześniej. Warto wstawiać klasy abstrakcyjne tam, gdzie występują wspólne funkcjonalności. Metoda podklasy może wywoływać więcej niż jedną metodę nadklasy. Jeżeli klasy mają wspólną funkcjonalność, ale nie mogą mieć wspólnej nadklasy, należy rozważyć stworzenie klasy pomocniczej. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 26 / 31

Template method metoda szablonowa Często ogólny algorytm jest wspólny dla wielu klas. Zmieniają się jedynie niektóre jego fragmenty. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 27 / 31

Strategy Jeżeli istnieje kilka algorytmów, które mogą być stosowane w danym kontekście, można je opakować w klasy i przekazywać odpowiedni obiekt. P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 28 / 31

State Jeżeli funkcjonalność obiektu powinna zmieniać się w czasie, trudno jest zdefiniować i umieścić w hierarchii hybrydową klasę implementującą odpowiednie metody. Lepiej zastosować klasę pomocniczą. c l a s s C u r s o r : def init ( s e l f ) : s e l f. usepentool ( ) def moveto ( s e l f, p o i n t ) : r e t u r n s e l f. c u r r e n t _ t o o l. moveto ( p o i n t ) def movedown ( s e l f, p o i n t ) : r e t u r n s e l f. c u r r e n t _ t o o l. movedown ( p o i n t ) def moveup ( s e l f, p o i n t ) : r e t u r n s e l f. c u r r e n t _ t o o l. moveup ( p o i n t ) def usepentool ( s e l f ) : s e l f. c u r r e n t _ t o o l = PenTool ( ) def u s e S e l e c t i o n T o o l ( s e l f ) : s e l f. c u r r e n t _ t o o l = S e l e c t i o n T o o l ( ) P. Daniluk (Wydział Fizyki) PO w. V Jesień 2015 29 / 31