Dědičnost (inheritance)

Podobné dokumenty
Generické programování

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

IRAE 07/08 Přednáška č. 1

Z. Kotala, P. Toman: Java ( Obsah )

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Výjimky. v C# a Javě

Java - výjimky. private void vstup() throws IOException {... }

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Ošetřování chyb v programech

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Java Výjimky Java, zimní semestr

PREPROCESOR POKRAČOVÁNÍ

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Programování v C++ 1, 6. cvičení

Výčtový typ strana 67

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Připravil: David Procházka. Programovací jazyk C++

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

IRAE 07/08 Přednáška č. 7. Začátek (head)

1. Téma 12 - Textové soubory a výjimky

KTE / ZPE Informační technologie

Principy objektově orientovaného programování

Soubor jako posloupnost bytů

Programování v C++ 3, 3. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dědění, polymorfismus

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Zápis programu v jazyce C#

Programování v C++ 1, 5. cvičení

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Programování v C++ 2, 4. cvičení

Objektové programování

typová konverze typová inference

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

PŘETĚŽOVÁNÍ OPERÁTORŮ

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

RMI Remote Method Invocation

Seminář Java II p.1/43

1. Programování proti rozhraní

29. Výjimky, jejich vznik, vyhození, odchyt a zpracování. (A7B36PVJ)

24. listopadu 2013, Brno Připravil: David Procházka

Java Řetězce Java, zimní semestr

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Seminář Java IV p.1/38

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

Objektově orientované programování v PHP 5. Martin Klíma

PB161 Programování v jazyce C++ Přednáška 4

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Základy objektové orientace I. Únor 2010

Výjimky. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Úvod do programovacích jazyků (Java)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

PB161 Programování v jazyce C++ Přednáška 7

17. Projekt Trojúhelníky

PB161 Programování v jazyce C++ Přednáška 7

Výjimky (exceptions), generické metody a třídy v C#

PB161 Programování v jazyce C++ Přednáška 8

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Typický prvek kolekce pro české řazení

Jazyk C# (seminář 3)

Abstraktní třída a rozhraní

Teoretické minimum z PJV

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Programování II. Úvod do dědičnosti 2018/19

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Jazyk C++ I. Polymorfismus

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

Programování v Javě I. Leden 2008

Dynamicky vázané metody. Pozdní vazba, virtuální metody

1. Dědičnost a polymorfismus

PB161 programování v C++ Výjimky Bezpečné programování

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Chování konstruktorů a destruktorů při dědění

Programování v Javě I. Únor 2009

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

PB161 Programování v jazyce C++ Přednáška 9

Zpracování výjimečných situací

Objektově orientované programování

Java a XML. 10/26/09 1/7 Java a XML

PB161 Programování v jazyce C++ Přednáška 9

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Kód, který se nebude často měnit

20. Projekt Domácí mediotéka

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Projekty pro výuku programování v jazyce Java

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Transkript:

Dědičnost (inheritance) Úvod Umožňuje objektům převzít (zdědit) členy jiných objektů a pouze je rozšířit o Auto: lze odvodit Vztah je osobní auto, cisterna jsou auta Základní pojmy Bázová třída (rodič) base class, parent Odvozená třída (potomek) derived class, children Hierarchie tříd class hierarchy Typy dědičnosti Jednoduchá Student +číslo +jméno +Registrovat() +PřerušitStudium() Student +číslo +jméno +Registrovat() +PřerušitStudium() Bakalar +Téma BP +Výsledky BSZ +Proveď BSZ() Bakalar +Téma BP +Výsledky BSZ +Proveď BSZ() Učeň +Téma praktické ZK +Proveď Závěrečné ZK() o Bakalar má svoje členy + vše od Student třída může být rodičem pro několik odvozených tříd Násobná jednoduchá dědičnost potomek je rodič pro další odvozenou třídu 1

Student +číslo +jméno +Registrovat() +PřerušitStudium() Bakalar +Téma BP +Výsledky BSZ +Proveď BSZ() Magistr +Téma DP +Výsledky MSZ +Proveď MSZ() Vícenásobná dědičnost potomek dědí od více rodičů C#, Java nelze, C++ ano ČlenKnihovny +Id +Výpůjčit() +Vrátit() Student +číslo +jméno +Registrovat() +PřerušitStudium() Bakalář +Téma BP +Výsledky BSZ +Proveď BSZ() Dědičnost v C# Jen jednoduchá, vícenásobná pouze přes tzv. rozhraní viz později Řízení viditelnosti protected chráněný člen viditelnost členů Člen v rodiči deklarován jako: Potomek vidí Vně tříd (R i P) public Ano Ano private Ne Ne protected Ano Ne o private člen viditelný pouze ve třídě, kde byl definován 2

Odvozené třídy o protected člen viditelný ve třídě, kde byl definován + ve všech odvozených třídách // definice bázové třídy nic se nemění private int atrb1; protected int atrb2; public void MetodaB() // definice odvozené třídy private int atro1; public void MetodaO() atro1 = atrb2; // atrb2 je protected // v Main() Bazova b = new Bazova(); b.metodab(); // jediny clen viditelny zvenci "Bazova" Odvozena o = new Odvozena(); o.metodab(); // metoda zdedena od "Bazova" o.metodao(); Dědičnost a konstruktory při vzniku instance odvozené třídy se automaticky jako první provede bezparametrický konstruktor třídy bázové public Bazova() Console.WriteLine("Bazova ctor"); public Bazova(int x) Console.WriteLine("Bazova ctor(0)", x); public Odvozena() Console.WriteLine("Odvozena ctor"); // v Main() Odvozena o = new Odvozena(); o vytiskne: Bazova ctor Odvozena ctor důvod: potomek přejímá atributy třídy bázové, ty musí projít inicializací. Konstruktor potomka jen inicializuje nově přidané atributy. 3

násobná jednoduchá dědičnost volají se všechny konstruktory počínaje první bázovou třídou a konče posledním potomkem volání parametrického konstruktoru bázové třídy ve třídě odvozené base o (další využití base viz za později) o Nutno si vynutit ručně public Bazova(int x) Console.WriteLine("Bazova ctor(0)", x); public Odvozena(int y): base(5*y) Console.WriteLine("Odvozena ctor(0)", y); // v Main() Odvozena o = new Odvozena(10); o vytiskne: Bazova ctor(50) Odvozena ctor(10) volání ctoru bázové třídy se sk. parametrem 5*y 4

shrnutí: public Odvozena(int x) // vytvoření instance: Odvozena b = new Odvozena(5) // provede se: Výchozí Bazova() Odvozena(5) public Bazova() public Odvozena(int x) // vytvoření instance: Odvozena b = new Odvozena(5) // provede se: Bazova() Odvozena(5) public Bazova(int x) public Odvozena(int x) // vytvoření instance: Odvozena b = new Odvozena(5) // provede se: Compiler Error!! error CS1501: No overload for method 'Bazova' takes '0' arguments public Bazova(int x) public Odvozena(int x): base(x) // vytvoření instance: Odvozena b = new Odvozena(5) // provede se: Bazova(5) Odvozena(5) Rodič zastupuje potomka někdy může být výhodné (viz virtuální metody později) rodič může potomka zastoupit má všechny jeho členy použito i v BCL. NET, např. TextWriter tw = new StreamWriter("Soubor.txt")) o StreamWriter je potomek TextWriter Jak provést? public void MB() class Odvozena : Bazova public void MO() o Při deklaraci // v Main Bazova o1 = new Odvozena(); o1.mb(); // o.mo() nelze 5

o Za běhu (lepší přetypovat) Odvozena o2 = new Odvozena(); Bazova o3 = o2; // sice OK, ale nedělat Bazova o4 = (Bazova)o2; // lepší Objekt přetypovaný na předka lze zpětně přetypovat na potomka (nevyužívá se) Odvozena o5 = (Odvozena)o4; // Odv. o2 na Baz. o4 a zpět na Odv. o5 o5.mo(); // OK Předka nelze přetypovat na potomka (rozšiřujeme funkčnost) Bazova o1 = new Bazova(); Odvozena o2 = (Odvozena)o1; Uzavřené třídy // InvalidCastingException modifikátor sealed z třídy nelze odvodit žádnou další sealed class Uzavrena // Definice členů výhoda kompilátor může optimalizovat nevýhoda zavírám si dveře pro možné další rozšiřování závěr používat s rozvahou Dědičnost vs. Skládání tříd Výjimky II Opakování skládání ( má ) převažuje nad dědičností ( je ) Princip: 1) V programu dojde k běhové chybě 2) Běh program se přeruší vyhodí se výjimka (throw exception) 3) Program se pokusí výjimku zachytit (catch exception) = ošetřit chybu ve spec. části kódu Zachycení výjimky v.net: o výjimka = objekt o spousty typů výjimek společný předek (viz. OOP příští-tento semestr), třída Exception vlastnost Message (string) = popis výjimky static void Main(string[] args) int x; try int a = Int32.Parse(Console.ReadLine()); // Int32.Parse() několik typu vyjimek x = 255 / a; // možná výjimka typu DivideByZeroException catch (Exception e) Console.WriteLine("Chyba!!!"); 6

Console.WriteLine(e.Message); // vytiskneme popis return; // ukoncime program Console.WriteLine("Vysledek deleni je 0", x); Hierarchie výjimek v BCL Object Exception SystemException AplicationException ArgumentException IOException Uživatelské výjimky ArgumentNullException FileLoadException ArgumentOutOfRangeException FileNotFoundException StackOverflowException DirectoryNotFoundException ArithmeticException A další OverflowException A další SystemException Systémové chyby (soubor se nepodařilo nalézt, argument metody musí být větší než nula, ) ApplicationException pro uživatelské výjimky, příklad: Vyhození vlastní výjimky Příkaz throw class Trida public void SetVek(int vek) if (vek < 0) throw new ArgumentOutOfRangeException ("parametr vek musi byt > 0"); //... public void FindData(double[] data) if (data == null) 7

//... //... throw new ArgumentNullException("Pole data je prazdne"); Vlastní typy výjimek = třídy odvozené od ApplicationException Doporučeno (Microsoft) explicitně definovat 3 konstruktory Příklad: class AutoException: ApplicationException public AutoException() public AutoException(string message): base(message) public AutoException(string message, Exception inner) : base(message, inner) class Auto double aktrychlost; public enum Rychlost Jedna, Dva, Tri, Neutral, Zpatecka public void Zarad(Rychlost stupen) if ((stupen == Rychlost.Zpatecka) && (aktrychlost > 20)) throw new AutoException ("Zaradil jsi zpatecku..., destrukce prevodovky"); 8