Programowanie obiektowe i zdarzeniowe

Podobne dokumenty
Podstawy programowania obiektowego

Podstawy programowania obiektowego

Programowanie obiektowe i zdarzeniowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe

Dziedziczenie. » Dodawanie nowych elementów klasy (składowych funkcyjnych, danych składowych)» Modyfikacje odziedziczonych składowych funkcyjnych

Programowanie obiektowe

Enkapsulacja, dziedziczenie, polimorfizm

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Dziedziczenie. dr Jarosław Skaruz

Polimorfizm. dr Jarosław Skaruz

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

Przykład -

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

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Wykład 6: Dziedziczenie

Programowanie obiektowe w języku

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Dziedziczenie Dana jest klasa Punkt w pliku o nazwie Punkt.java:

Zaawansowane programowanie w C++ (PCP)

Wykład 7: Pakiety i Interfejsy

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

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

Zaawansowane programowanie w C++ (PCP)

.NET Klasy, obiekty. ciąg dalszy

Zaawansowane programowanie w języku C++ Programowanie obiektowe

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe

Kurs WWW. Paweł Rajba.

Czym jest polimorfizm?

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Java: interfejsy i klasy wewnętrzne

Wykład 4: Klasy i Metody

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

Aplikacje w środowisku Java

Dokumentacja do API Javy.

Programowanie obiektowe i zdarzeniowe

Technologie i usługi internetowe cz. 2

DOSTĘP DO METOD I ZMIENNYCH. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla każdego, Helion 2001)

Definiowanie własnych klas

Projektowanie obiektowe. Roman Simiński Polimorfizm

Java Język programowania

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

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

Klasy abstrakcyjne i interfejsy

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

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Języki i metody programowania Java Lab2 podejście obiektowe

Podstawy programowania obiektowego

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

Programowanie obiektowe

Podstawy programowania obiektowego

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

TEMAT : KLASY POLIMORFIZM

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

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

1. Klasa typu sealed. Przykład 1. sealed class Standard{ class NowyStandard:Standard{ // błd!!!

Programowanie obiektowe. Wykład 03. Maciej Wołoszyn 17 marca Polimorfizm oraz wczesne i późne wiazanie

Podstawy Języka Java

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

Metody Metody, parametry, zwracanie wartości

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

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

DOSTĘP DO METOD I ZMIENNYCH, TABLICE. Dostęp do zmiennych (na podstawie:l.lemay,r.cadenhead,java 2 dla kaŝdego, Helion 2001)

Obiekty: co i jak. Wykonał: Piotr Pięda dla koła naukowego KNI

KOTLIN. Język programowania dla Androida

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Dziedziczenie. Tomasz Borzyszkowski

Języki programowania imperatywnego

dr inż. Jarosław Forenc

Programowanie obiektowe

Programowanie obiektowe

Dziedziczenie jednobazowe, poliformizm

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

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

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

C++ - [4-7] Polimorfizm

Programowanie obiektowe

UML a kod. C++, Java i C#

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm. C++ - polimorfizm POLIMORFIZM

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Programowanie w Javie wykład 8 Interfejsy

Programowanie obiektowe

Programowanie, część I

Klasa dziedzicząca posiada wszystkie cechy klasy bazowej (plus swoje własne) dodawanie nowego kodu bez edycji (i ewentualnego wprowadzania

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

Plik klasy. h deklaracje klas

Aplikacje w środowisku Java

Czym jest polimorfizm?

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

Programowanie w środowiskach graficznych. Wykład 3 Język C#

Transkrypt:

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/23 Programowanie obiektowe i zdarzeniowe wykład 6 polimorfizm Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie klasy już istniejącej, klasa pochodna dziedziczy pola i metody klasy bazowej, ale nie dziedziczy konstruktorów, klasa pochodna może dodawać własne pola i metody, a także przesłaniać pola i metody klasy bazowej, klasa pochodna może odwołać się do klasy bazowej przy pomocy słowa kluczowego base.

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 2/23 Klasa pochodna dziedziczy nie tylko pola i metody, ale również typ. class Osoba protected String imię; protected String nazwisko; class Pracownik : Osoba protected double płaca; public void wypłać() /*...*/ Klasa Pracownik dziedziczy z klasy Osoba, a zatem Pracownik jest szczególnym rodzajem Osoby, a zatem Pracownik jest Osobą. Co z tego wynika? Rzutowanie w górę: Tworzymy Pracownika, ale traktujemy go jako Osobę. Osoba os = new Pracownik("Piotr", "Nowak", 2200.0); os.wypłać();

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 3/23 Klasa pochodna dziedziczy nie tylko pola i metody, ale również typ. class Osoba protected String imię; protected String nazwisko; class Pracownik : Osoba protected double płaca; public void wypłać() /*...*/ Osoba os = new Pracownik("Piotr", "Nowak", 2200.0); os.wypłać(); //... Pracownik pr = (Pracownik)os; pr.wypłać(); Rzutowanie w dół: Tę Osobę potraktujemy jako Pracownika (to działa, gdyż faktycznie jest to Pracownik).

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 4/23 Klasa pochodna dziedziczy nie tylko pola i metody, ale również typ. class Osoba protected String imię; protected String nazwisko; class Pracownik : Osoba protected double płaca; public void wypłać() /*...*/ Osoba os = new Pracownik("Piotr", "Nowak", 2200.0); os.wypłać(); //... if(os is Pracownik) Pracownik pr = (Pracownik)os; pr.wypłać(); Rzutowanie w dół: Bezpieczniejsze rozwiązanie sprawdzenie faktycznego typu obiektu

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 5/23 Klasa pochodna dziedziczy nie tylko pola i metody, ale również typ. class Osoba protected String imię; protected String nazwisko; class Pracownik : Osoba protected double płaca; public void wypłać() /*...*/ Osoba os = new Pracownik("Piotr", "Nowak", 2200.0); os.wypłać(); //... Pracownik pr = os as Pracownik; if (pr!= null) pr.wypłać(); Rzutowanie w dół: Jeszcze inne rozwiązanie null oznacza brak obiektu pod tą referencją

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 6/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. class Figura public void rysuj() Console.WriteLine("rysuję figurę"); class Trójkąt : Figura public void rysuj() Console.WriteLine("rysuję trójkąt"); class Koło : Figura public void rysuj() Console.WriteLine("rysuję koło"); class Prostokąt : Figura public void rysuj() Console.WriteLine("rysuję prostokąt");

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 7/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; figury[0] = new Koło(); figury[1] = new Trójkąt(); figury[2] = new Prostokąt();

Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; figury[0] = new Koło(); figury[1] = new Trójkąt(); figury[2] = new Prostokąt(); figury[1].rysuj(); Pytanie: jaka figura się narysuje? która metoda rysuj() się wywoła? class Figura rysuję figurę public void rysuj() Console.WriteLine("rysuję figurę"); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 8/23

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 9/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; figury[0] = new Koło(); figury[1] = new Trójkąt(); figury[2] = new Prostokąt(); (figury[1] as Trójkąt).rysuj(); // lub: ((Trójkąt)figury[1]).rysuj(); Rzutowanie w dół pozwala dostać się do rzeczywistego obiektu ukrytego w tablicy. rysuję trójkąt

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 10/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; figury[0] = new Koło(); figury[1] = new Trójkąt(); figury[2] = new Prostokąt(); Skąd jednak mamy pewność, że to faktycznie trójkąt? Random rnd = new Random(); for (int i = 0; i < figury.length; ++i) switch (rnd.next(3)) case 0: figury[i] = new Koło(); break; case 1: figury[i] = new Trójkąt(); break; case 2: figury[i] = new Prostokąt(); break;

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 11/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; figury[0] = new Koło(); figury[1] = new Trójkąt(); figury[2] = new Prostokąt(); Skąd jednak mamy pewność, że to faktycznie trójkąt? for (int i = 0; i < figury.length; ++i) Console.WriteLine("Wybierz rodzaj figury:..."); int wybór = int.parse(console.readline()); switch (wybór) case 0: figury[i] = new Koło(); break; case 1: figury[i] = new Trójkąt(); break; case 2: figury[i] = new Prostokąt(); break;

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 12/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; // wypełnianie tablicy figur if (figury[1] is Trójkąt) ((Trójkąt)figury[1]).rysuj(); else if (figury[1] is Koło) ((Koło)figury[1]).rysuj(); else if (figury[1] is Prostokąt) ((Prostokąt)figury[1]).rysuj(); Operator is sprawdza faktyczny typ obiektu w tablicy.

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 13/23 Do czego może się to przydać? Dzięki temu możemy traktować w jednakowy sposób wiele obiektów należących do jednej rodziny (hierarchii) określane jest to jako polimorfizm. static void Main(string[] args) Figura[] figury = new Figura[10]; // wypełnianie tablicy figur Operację możemy wykonać dla każdego elementu tablicy. foreach (Figura figura in figury) if (figura is Trójkąt) ((Trójkąt)figura).rysuj(); else if (figura is Koło) ((Koło)figura).rysuj(); else if (figura is Prostokąt) ((Prostokąt)figura).rysuj(); Operator is sprawdza faktyczny typ obiektu w tablicy.

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 14/23 Jeśli oznaczymy metodę jako wirtualną, program sam (automatycznie) będzie dokonywał powyższych sprawdzeń i rzutowań w momencie jej wywołania. class Figura public virtual void rysuj()... class Trójkąt : Figura public override void rysuj()... class Koło : Figura public override void rysuj()... class Prostokąt : Figura public override void rysuj()... Przesłaniając metodę wirtualną dodajemy słowo kluczowe override, wskazujące, że chcemy nadpisać wersję z klasy bazowej

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 15/23 Jeśli oznaczymy metodę jako wirtualną, program sam (automatycznie) będzie dokonywał powyższych sprawdzeń i rzutowań w momencie jej wywołania. Teraz poniższy kod będzie działał prawidłowo. static void Main(string[] args) Figura[] figury = new Figura[10]; // wypełnianie tablicy figur foreach (Figura figura in figury) figura.rysuj(); Zawsze wywoła się wersja metody rysuj() z odpowiedniej klasy.

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 16/23 Interfejsy i klasy abstrakcyjne Niekiedy klasa bazowa istnieje tylko po to, aby stanowić uogólnienie klas z niej dziedziczących umożliwiać wspólne ich traktowanie (polimorfizm) Nigdy natomiast nie będziemy tworzyć obiektów tej klasy bazowej. Przykład: Figura (to nieokreślona figura). Taką klasę dobrze jest zdefiniować jako abstrakcyjną. abstract class Figura public void rysuj() Console.WriteLine("rysuję figurę"); Klasa abstrakcyjna może być definiowana tak, jak każda inna klasa (mieć pola, metody, konstruktory). Jedynie ograniczenie nie możemy tworzyć jej obiektów: Figura figura = new Figura(); Możemy jednak normalnie tworzyć referencje na klasę abstrakcyjną: Figura figura = new Prostokąt();

Niekiedy klasa abstrakcyjna ma metody, o których wiemy, że nigdy się nie wywołają (gdyż każda z klas pochodnych dostarczy swoją wersję tej metody). Możemy oznaczyć je jako abstrakcyjne. Metoda abstrakcyjna nie ma ciała a jedynie nagłówek. abstract class Figura public abstract void rysuj(); Klasa dziedzicząca z abstrakcyjnej musi dostarczyć implementację wszystkich metod abstrakcyjnych. class Prostokąt : Figura public override void rysuj() Console.WriteLine("rysuję prostokąt"); Po co nam metoda, która się nie wywoła? Jest konieczna, aby można było skorzystać z polimorfizmu stanowi ona wspólny dostęp do wszystkich wersji metody rysuj(). Figura figura = new Prostokąt(); figura.rysuj(); Marek Tabędzki Programowanie obiektowe i zdarzeniowe 17/23

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 18/23 Specyficzną odmianą klas abstrakcyjnych są interfejsy. Typ interfejsowy to zbiór nagłówków publicznych metod klasy. Interfejs nie może mieć: konstruktorów, zwykłych metod, pól. interface Figura void rysuj(); Dziedziczenie z typu interfejsowego wygląda tak samo, jak ze zwykłej klasy. class Prostokąt : Figura public void rysuj() Metody z interfejsu muszą być publiczne. Console.WriteLine("rysuję prostokąt"); Można implementować wiele interfejsów (dziedziczyć z wielu typów interfejsowych). Typu interfejsowe mogę nawzajem z siebie dziedziczyć.

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 19/23 Przykład: wyrażenie (a + b). class Liczba private int wart; public Liczba(int wart) this.wart = wart; public int Wartość() return wart; public override String ToString() return wart.tostring();

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 20/23 Przykład: wyrażenie (a + b). Klasa reprezentująca class Plus operator Plus przechowuje dwa private Liczba lewa, prawa; argumenty (Liczby). public Plus(Liczba l, Liczba p) lewa = l; prawa = p; public int Wartość() return lewa.wartość() + prawa.wartość(); public override String ToString() return String.Format("(0 + 1)", lewa, prawa);

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 21/23 Przykład: wyrażenie (a + b). static void Main(string[] args) Plus p = new Plus(new Liczba(2), new Liczba(3)); Console.WriteLine("0 = 1", p, p.wartość()); Console.ReadKey(); p Plus lew (2 + 3) = 5 pra Liczba 2 Liczba 3

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 22/23 A co z bardziej złożonym wyrażeniem? (a + (b * c)) static void Main(string[] args) Plus p = new Plus(new Liczba(1), new Razy(new Liczba(2), new Liczba(3))); Console.WriteLine("0 = 1", p, p.wartość()); Console.ReadKey(); p Plus lew pra (1 + (2 * 3)) = 7 Liczba 1 Razy lew pra Liczba Liczba 2 3

Marek Tabędzki Programowanie obiektowe i zdarzeniowe 23/23 A co z bardziej złożonym wyrażeniem? (a + (b * c)) interface Wyrażenie int Wartość(); class Liczba : Wyrażenie... Argumentem może być public int Wartość() return wart; Liczba lub... kolejny operator (np. Razy). class Plus : Wyrażenie W ogólnym przypadku: Wyrażenie. private Wyrażenie lewe, prawe; public Plus(Wyrażenie l, Wyrażenie p)... public int Wartość()... public override String ToString()... class Razy : Wyrażenie private Wyrażenie lewe, prawe; public Razy(Wyrażenie l, Wyrażenie p)... public int Wartość()... public override String ToString()...