Podstawy programowania obiektowego

Podobne dokumenty
Programowanie obiektowe i zdarzeniowe

Podstawy programowania obiektowego

Programowanie obiektowe i zdarzeniowe

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

Programowanie obiektowe

Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Wykład 4: Klasy i Metody

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie obiektowe

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

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

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

Dziedziczenie. dr Jarosław Skaruz

Podstawy programowania obiektowego

Zaawansowane programowanie w C++ (PCP)

PARADYGMATY PROGRAMOWANIA Wykład 4

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

Programowanie obiektowe w języku

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

Wykład 8: Obsługa Wyjątków

Programowanie obiektowe

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

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

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

Mechanizm dziedziczenia

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

dr inż. Jarosław Forenc

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

Dawid Gierszewski Adam Hanasko

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

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

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

Aplikacje w środowisku Java

Plik klasy. h deklaracje klas

Programowanie obiektowe

Programowanie obiektowe

Programowanie Obiektowe Ćwiczenie 4

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Metody Metody, parametry, zwracanie wartości

Polimorfizm. dr Jarosław Skaruz

Enkapsulacja, dziedziczenie, polimorfizm

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

Wykład 6: Dziedziczenie

Aplikacje w środowisku Java

Programowanie obiektowe

TEMAT : KLASY DZIEDZICZENIE

Wykład 7: Pakiety i Interfejsy

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Logger. Następnie w klasie Bootstrapper muimy zarejestrować nasz nowy logger:

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

KOTLIN. Język programowania dla Androida

Programowanie obiektowe

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

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

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

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Java Język programowania

Język C++ wykład VIII

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Języki i techniki programowania Ćwiczenia 4 Wzorce

Projektowanie obiektowe. Roman Simiński Polimorfizm

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

.NET Klasy, obiekty. ciąg dalszy

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

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

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

Tworzenie aplikacji w języku Java

Definiowanie własnych klas

Programowanie obiektowe

Języki programowania imperatywnego

Programowanie obiektowe

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

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

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Rozdział 4 KLASY, OBIEKTY, METODY

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

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

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

Programowanie obiektowe

Programowanie obiektowe

Programowanie obiektowe

Przykład -

Czym jest polimorfizm?

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Materiały do zajęć III

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

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

Transkrypt:

1/23 Podstawy programowania obiektowego wykład 8 polimorfizm, wyjątki, kolekcje generyczne 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.

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ć();

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).

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

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ą

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");

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? rysuję figurę class Figura public void rysuj() Console.WriteLine("rysuję figurę"); 8/23

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

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;

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; 11/23

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.

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.

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

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.

16/23 Jak powiadamiać o błędach? Może wypisać komunikat? class Konto public void wypłać(double kwota) if (kwota <= 0) Console.WriteLine("Błędna kwota"); else if (kwota > suma) Console.WriteLine("Brak środków"); else suma -= kwota; Komunikat to informacja dla użytkownika, ale jak powiadomić programistę, aby mógł zareagować na błąd?

17/23 Jak powiadamiać o błędach? Może wypisać komunikat? class Konto public void wypłać(double kwota)... Komunikat to informacja dla użytkownika, ale jak powiadomić programistę, aby mógł zareagować na błąd? static void Main(string[] args) // wykonywanie przelewu Konto k1 = new Konto(), k2 = new Konto(); double kwota = double.parse(console.readline()); k1.wypłać(kwota); k2.wpłać(kwota); Jeśli był błąd przy wypłacie, nie powinniśmy wpłacać!

Jak powiadamiać o błędach? W programowaniu obiektowym preferowanym rozwiązaniem są wyjątki. class Konto Wystąpienie wyjątku public void wypłać(double kwota) powoduje zakończenie metody. if (kwota <= 0) throw new Exception("Błędna kwota"); if (kwota > suma) throw new Exception("Brak środków"); suma -= kwota; static void Main(string[] args) // wykonywanie przelewu Konto k1 = new Konto(), k2 = new Konto(); double kwota = double.parse(console.readline()); k1.wypłać(kwota); k2.wpłać(kwota); Domyślna reakcja na wystąpienie wyjątku to zakończenie programu (to lepsze niż działanie z błędem). 18/23

Pytanie: Jak lepiej reagować na wyjątek? Odpowiedź: Łapać go. class Konto public void wypłać(double kwota)... static void Main(string[] args) // wykonywanie przelewu Konto k1 = new Konto(), k2 = new Konto(); double kwota = double.parse(console.readline()); try catch k1.wypłać(kwota); k2.wpłać(kwota); Blok objęty kontrolą. Blok łapania wyjątku. Console.WriteLine("Operacja nieudana"); 19/23

Pytanie: Jak lepiej reagować na wyjątek? Odpowiedź: Łapać go. class Konto public void wypłać(double kwota)... static void Main(string[] args) // wykonywanie przelewu Konto k1 = new Konto(), k2 = new Konto(); double kwota = double.parse(console.readline()); try k1.wypłać(kwota); k2.wpłać(kwota); catch(exception ex) W ten sposób możemy uzyskać informację o wyjątku, który wystąpił. Console.WriteLine("Operacja nieudana: "+ ex.message); 20/23

21/23 Kolekcje generyczne w C#: lista, gdzie każdy element ma swój indeks (może być traktowana jako dynamiczna tablica): List<Element> słownik pewnej wartości klucza przyporządkowują pewną wartość (mogą być traktowane jako uogólnienie tablic): Dictionary<Klucz, Wartość> Tworząc kolekcję określamy rodzaj przechowywanego elementu (może to byćtyp obiektowy lub prosty). List<Figura> figury = new List<Figura>(); Dictionary<string, Figura> słownik = new Dictionary<string, Figura>();

22/23 Najważniejsze metody klasy List<>: Add(Element o) i Insert(int indeks, Element o) wstawianie elementu do listy na koniec lub pod żądanym indeksem bool Contains(Element o) i int IndexOf(Element o) przeszukiwanie listy void Clear(), void RemoveAt(int index), bool Remove(Element o) usuwające elementy z listy Przeglądanie listy: for(int i = 0; i < al.count; ++i) lista[i].metoda(); lub: foreach(element e in lista) e.metoda(); Dostęp do listy jak do zwykłej tablicy.

23/23 Najważniejsze metody klasy Dictionary<>: Add(Klucz key, Element value) umieszcza wartość pod danym kluczem Clear(), Remove(Klucz key) usuwanie zawartości bool ContainsKey(Klucz key) sprawdza, czy jest jakaś wartość pod danym kluczem (szybka metoda) bool ContainsValue(Element value) sprawdza, czy w mapie jest dana wartość (wolna metoda) Dictionary<string, string> słownik = new Dictionary<string, string>(); słownik.add("kot", "cat"); słownik.add("dom", "house"); if(słownik.containskey("dom")) Console.WriteLine(słownik["dom"]); Dostęp do słownika jak do zwykłej tablicy.