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

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

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

Wyjątki (exceptions)

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

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

Interfejsy i klasy wewnętrzne

Obsługa wyjątków. Język C++ WW12

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Kurs programowania. Wykład 9. Wojciech Macyna

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

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

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

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

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

Klasy cd. Struktury Interfejsy Wyjątki

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

Język C++ wykład VIII

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

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

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

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

Klasy abstrakcyjne i interfejsy

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Multimedia JAVA. Historia

Programowanie obiektowe

Programowanie obiektowe

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

Wstęp do Programowania 2

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

Projektowanie klas c.d. Projektowanie klas przykład

Wstęp do programowania

Efekty uboczne błędów

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

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Polimorfizm. dr Jarosław Skaruz

PARADYGMATY PROGRAMOWANIA Wykład 4

Aplikacje w środowisku Java

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Programowanie obiektowe

Zaawansowane programowanie w języku C++ Wyjątki

TEMAT : KLASY POLIMORFIZM

Mechanizm dziedziczenia

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie Obiektowe Ćwiczenie 4

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Wykład 8: klasy cz. 4

Dawid Gierszewski Adam Hanasko

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

Listy powiązane zorientowane obiektowo

Plik klasy. h deklaracje klas

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

Zaawansowane programowanie w C++ (PCP)

Kurs programowania. Wykład 8. Wojciech Macyna

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

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Wykład 5 Okna MDI i SDI, dziedziczenie

TEMAT : KLASY DZIEDZICZENIE

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

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

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

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

Materiały do zajęć VII

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

Programowanie w Javie wykład 9 Klasy wewnętrzne, klasy anonimowe Klasy opakowujące

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

C-struktury wykład. Dorota Pylak

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

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

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Dziedziczenie. Tomasz Borzyszkowski

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Programowanie obiektowe

Wykład 5: Więcej o Klasach i Metodach

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

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Java Język programowania

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe w C++ Wykład 12

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Przesłanianie nazw, przestrzenie nazw

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

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

Programowanie obiektowe

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Transkrypt:

Wykład 3 22 marca 2019

Klasy wewnętrzne Klasa wewnętrzna class A {... class B {... }... } Klasa B jest klasa wewnętrzna w klasie A. Klasa A jest klasa otaczajac a klasy B.

Klasy wewnętrzne Właściwości Może być zadeklarowana ze specyfikatorem private (normalne klasy nie!), uniemożliwiajac wszelki dostęp spoza klasy otaczajacej Może odwoływać się do niestatycznych składowych klasy otaczajacej (jeśli nie jest zadeklarowana ze specyfikatorem static) Może być zadeklarowana ze specyfikatorem static (normalne klasy nie!), co powoduje, że z poziomu tej klasy nie można odwoływać się do składowych niestatycznych klasy otaczajacej (takie klasy nazywaja się zagnieżdżonymi) Może mieć nazwę (klasa nazwana) Może nie mieć nazwy (wewnętrzna klasa anonimowa) Może być lokalna zdefiniowana w bloku (metodzie lub innym bloku np. w bloku po instrukcji if)

Klasy wewnętrzne Zastosowanie Klasy wewnętrzne moga być ukryte przed innymi klasami pakietu (względy bezpieczeństwa). Klasy wewnętrzne pozwalaja unikać kolizji nazw (np. klasa wewnętrzna nazwana Vector nie koliduje nazwa z klasa zewnętrzna o tej samej nazwie). Klasy wewnętrzne (w szczególności anonimowe) sa intensywnie używane przy implementacji standardowych interfejsów Javy. Anonimowe klasy wewnętrzne pozwalaja na traktowanie fragmentów kodu do wykonania (ściślej: metod przedefiniowywanych w tych klasach) jak obiektów.

Anonimowe klasy wewnętrzne Cechy charakterystyczne Anonimowe klasy wewnętrzne nie maja nazwy. Najczęściej tworzymy klasy wewnętrzne po to, by przedefiniować jakieś metody klasy dziedziczonej przez klasę wewnętrzna badź zdefiniować metody implementowanego przez nia interfejsu na użytek jednego obiektu. Klasa wewnętrzna Definicję anonimowej klasy dostarczamy w wyrażeniu new. 1 new NazwaTypu ( parametry ) { 2 // pola i metody klasy wewn trznej 3 } NazwaTypu nazwa nadklasy (klasy dziedziczonej w klasie wewnętrznej) lub implementowanego przez klasę wewnętrzna interfejsu parametry argumenty przekazywane konstruktorowi nadklasy; w przypadku gdy NazwaTypu jest nazwa interfejsu lista parametrów jest oczywiście pusta (bo chodzi o implementację interfejsu).

Anonimowe klasy wewnętrzne Uwagi Anonimowe klasy wewnętrzne nie moga mieć konstruktorów (bo nie maja nazwy) Za pomoca anonimowej klasy wewnętrznej można stworzyć tylko jeden obiekt, bo definicja klasy podana jest w wyrażeniu new czyli przy tworzeniu obiektu, a nie majac nazwy klasy nie możemy potem tworzyć innych obiektów Definiowanie klas wewnętrznych implementujacych interfejsy stanowi jedyny dopuszczalny przypadek użycia nazwy interfejsu w wyrażeniu new Anonimowe klasy wewnętrzne sa kompilowane do plików.class o nazwach automatycznie nadawanych przez kompilator

Typy wyliczeniowe Typ wyliczeniowy Definicja typu wyliczeniowego polega na umieszczeniu po słowie enum w nawiasach klamrowych elementów wyliczenia, rozdzielonych przecinkami: [ public] enum NazwaTypu { elt1, elt2,..., eltn } gdzie: elt - elementy wyliczenia

Typy wyliczeniowe Prosty typ wyliczeniowy 1 public enum Kolor { 2 CZERWONY, ZIELONY, NIEBIESKI ; 3 } Jako klasa wewnętrzna 1 public class EnumTest { 2 public enum Kolor { 3 CZERWONY, ZIELONY, NIEBIESKI ; 4 } 5 } Wywołanie 1 public static void main ( String [] args ) { 2 EnumTest. Kolor kolor = EnumTest. Kolor. CZERWONY ; 3 if ( kolor. equals ( EnumTest. Kolor. CZERWONY )) { 4 System. out. println (" Zgadza sie " ); 5 } 6 }

Wyjatki Dobrze napisany kod powinien zakładać możliwość wystapienia sytuacji wyjatkowych. Zazwyczaj jednak nie da się podjać żadnych działań naprawczych w miejscu ich wykrycia. Trzeba przerwać normalny tok działania programu i przekazać informacje o błędzie na zewnatrz, do szerszego kontekstu (do metody, która wywołała dana metodę lub jeszcze dalej), gdzie moga być podjęte działania naprawcze. Mechanizm obsługi wyjatków Nowoczesne obiektowe języki programowania maja wbudowany specjalny mechanizm ułatwiajacy i upraszczajacy radzenie sobie z obsługa sytuacji wyjatkowych. W chwili wykrycia takiej sytuacji można stworzyć specjalny obiekt nazywany wyjatkiem (ang. exception), zawrzeć w nim pewne informacje i przy pomocy specjalnej instrukcji throw zgłosić ten wyjatek do obsłużenia. Zgłoszenie wyjatku wymusza przerwanie normalnego trybu wykonywania programu i zwinięcie stosu wywołań, aż do napotkania kontekstu zawierajacego kod obsługi dla wyjatków tego rodzaju.

Deklarowanie wyjatków Deklarowanie wyjatku (Java) Wyjatki musza być klasa pochodna klasy Exception. class MojException extends Exception {}; Deklarowanie wyjatku (C++) Wyjatki moga być typu podstawowego (int lub string) lub dowolnie zdefiniowana klasa. Deklarowanie użycia wyjatku przez metodę (Java) void mojametoda() throws MojException; Deklarowanie użycia wyjatku przez metodę (C++) void mojametoda() throw(string);

Wywoływanie wyjatku Wywołanie wyjatku (Java) throw new MojException(); Wywołanie wyjatku (C++) throw (string)"mojexception";

Przechwytywanie wyjatku Instrukcje try i catch try { <metoda mog ca zwróci wyj tek> } catch(typ_wyj tku e) { <obsªuga wyj tku> } Po jednym bloku try może być kilka bloków catch zadziała pierwszy w którym dopasuje się typ wyjatku (działaja tu zasady dziedziczenia i polimorfizmu).

Klasa Exception w Java-ie Główne konstruktory Exception(String message) konstruktor inicjowany komunikatem błędu; Exception() wyjatek bez komunikatu błędu. Metody getmessage() zwraca komunikat błędu.

Hierarchia klas wyjatków w Java-ie

Hierarchia klas wyjatków w bibliotece standardowej C++

Przykład (Java) TablicaBoolTest.java (1) 1 class MojException extends Exception { 2 MojException ( String w) { super (w ); } 3 }; 4 class TablicaBool { 5 private boolean [] t; 6 public boolean getvalue ( int i ) throws MojException { 7 if ( (i <0) (i>=t. length ) ) 8 throw new MojException (" Przekroczenie zakresu " ); 9 return t[i ]; 10 } 11 public void setvalue ( int i, boolean b ) throws MojException { 12 if ( (i <0) (i>=t. length ) ) 13 throw new MojException (" Przekroczenie zakresu " ); 14 t[i] = b; 15 } 16 TablicaBool ( int i ) throws MojException { 17 if (i <=0) 18 throw new MojException (" Zle inicjowanie tablicy!" ); 19 try { 20 t = new boolean [i ]; 21 } 22 catch ( OutOfMemoryError e ) { 23 throw new MojException (" Za malo pamieci " ); 24 } 25 } 26 }

Przykład (Java) TablicaBoolTest.java (2) 1 public class TablicaBoolTest { 2 public static void main ( String [] arg ) { 3 TablicaBool t; 4 int n = 2; 5 6 try { t = new TablicaBool (n ); } 7 catch ( MojException e ) { 8 System. out. println ( e. getmessage () ); 9 return ; 10 } 11 12 try { t. setvalue (20, true ); } 13 catch ( MojException e ) { 14 System. out. println ( e. getmessage () ); 15 } 16 } 17 }

Ten sam program w C++ TablicaBool.cpp (1) 1 # include < iostream > 2 # include < string > 3 # include < exception > 4 5 using namespace std ; 6 7 class MojException : public exception { 8 private : 9 string s; 10 public : 11 MojException ( string ss ) : s( ss ) {}; 12 virtual ~ MojException () throw () {}; 13 virtual const char * what () const throw () { return s. c_str (); }; 14 };

Ten sam program w C++ TablicaBool.cpp (2) 16 class TablicaBool { 17 private : 18 bool * t; 19 long n; 20 public : 21 bool getvalue ( long i ) throw ( MojException ) { 22 if ( (i <0) (i>=n) ) throw MojException (" Zly indeks tablicy " ); 23 return t[i ]; 24 } 25 void setvalue ( long i, bool b ) throw ( MojException ) { 26 if ( (i <0) (i>=n) ) throw MojException (" Zly indeks tablicy " ); 27 t[i] = b; 28 } 29 TablicaBool ( long n ) throw ( MojException ) { 30 if (n <=0) throw MojException (" Zly rozmiar tablicy " ); 31 try { 32 t = new bool [n ]; 33 } 34 catch ( bad_alloc & w) { 35 throw MojException (" Za malo pamieci " ); 36 } 37 this ->n=n; 38 } 39 ~ TablicaBool () { delete t; } 40 };

Ten sam program w C++ TablicaBool.cpp (3) 42 int main ( int argc, char * argv [] ) { 43 TablicaBool *t; 44 long n = 2000000000; 45 46 try { 47 t = new TablicaBool (n ); 48 } 49 catch ( MojException & w) { 50 cout << w. what () << endl ; return 1; 51 } 52 try { t -> setvalue (20, true ); } 53 catch ( MojException & w) { 54 cout << w. what () << endl ; 55 } 56 delete t; 57 }

Przykład (Java) wielokrotne użycie catch TablicaBoolTest2.java (1) 1 class Moj1Exception extends Exception {}; 2 class Moj2Exception extends Exception {}; 3 class TablicaBool2 { 4 private boolean [] t; 5 public boolean getvalue ( int i ) throws Moj2Exception { 6 if ( (i <0) (i>=t. length ) ) throw new Moj2Exception (); 7 return t[i ]; 8 } 9 public void setvalue ( int i, boolean b ) throws Moj2Exception { 10 if ( (i <0) (i>=t. length ) ) throw new Moj2Exception (); 11 t[i] = b; 12 } 13 TablicaBool2 ( int i ) throws Moj1Exception { 14 if (i <=0) throw new Moj1Exception (); 15 t = new boolean [i ]; 16 } 17 }

Przykład (Java) wielokrotne użycie catch TablicaBoolTest2.java (2) 1 public class TablicaBoolTest2 { 2 public static void main ( String [] arg ) { 3 TablicaBool2 t; 4 int n = 2; 5 try { 6 t = new TablicaBool2 (n ); 7 t. setvalue (20, true ); 8 } 9 catch ( Moj2Exception e ) { 10 System. out. println ( " Przekroczenie zakresu " ); 11 } 12 catch ( Moj1Exception e ) { 13 System. out. println ( " Zle inicjowanie tablicy!" ); 14 } 15 catch ( Exception e ) { 16 System. out. println ( " Niespodzianka " ); 17 } 18 } 19 }

Podsumowanie Wyjatki zostały wprowadzone do języków programowania, ponieważ obsługa wszystkich sytuacji wyjatkowych mogacych wystapić w trakcie wywoływania każdej kolejnej metody jest zbyt uciażliwa. Dzięki obsłudze błędów z całego bloku instrukcji, ilość kodu koniecznego do obsługi sytuacji wyjatkowych ulega ograniczeniu. Mechanizm obsługi wyjatków pozwala przenieść kod obsługi sytuacji wyjatkowej z dala od miejsca jej wykrycia. Zgłoszenie wyjatku przerywa normalny przepływ sterowania i rozpoczyna rozwijanie stosu wywołań, aż do napotkania kodu obsługujacego ten typ wyjatku. Dzięki temu, jeżeli w danym miejscu nie wiadomo jak zareagować na dany wyjatek, po prostu się go ignoruje i obsługuje gdzie indziej. Zebranie i przeniesienie w dogodne miejsce kodu radzacego sobie z sytuacjami wyjatkowymi sprawia, że reszta programu staje się bardziej przejrzysta i spójna.