Programování II. Dědičnost změna chování 2018/19

Podobné dokumenty
Programování II. Polymorfismus

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

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

Programování II. Objektová dekompozice Třída jako objekt 2018/19

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Programování II. Návrh programu I 2018/19

Programování II. Modularita 2017/18

1. Dědičnost a polymorfismus

Programování II. Návrh programu II

Dědění, polymorfismus

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

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

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

Základy objektové orientace I. Únor 2010

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.

Abstraktní třída a rozhraní

Programování v C++ VI

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

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

1. Programování proti rozhraní

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

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

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

Virtuální metody - polymorfizmus

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

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

10 Balíčky, grafické znázornění tříd, základy zapozdření

typová konverze typová inference

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

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

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

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

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

Konstruktory a destruktory

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

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

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

Více o konstruktorech a destruktorech

20. Projekt Domácí mediotéka

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Obsah. October 2, Polymorfizmus. Typologie testování. Problém polymorfizmu. Vady/Anomálie. Vazební sekvence ČVUT FEL, K13132

Objektové programování

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

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.

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

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

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

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

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

Generické programování

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Delphi - objektově orientované

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

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

Jazyk C# (seminář 3)

Seminář Java II p.1/43

PREPROCESOR POKRAČOVÁNÍ

9. Polymorfismus a rozhraní

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

11. Dědičnost. Dědičnost strana 103

Výčtový typ strana 67

Programujeme v softwaru Statistica

Objektově orientované programování. Úvod

Paradigmata programování 2

10 Generické implementace

Seminář Java IV p.1/38

Dědičnost (inheritance)

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

Mělká a hluboká kopie

8 Třídy, objekty, metody, předávání argumentů metod

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

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

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

3. Třídy. Základní pojmy objektového programování. Třídy

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

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

Vyřešené teoretické otázky do OOP ( )

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

Úvod do programovacích jazyků (Java)

Objektově orientované programování v jazyce Python

C# - OOP (object oriented programming)

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

OOT Objektově orientované technologie

Spojová implementace lineárních datových struktur

Objektově orientované programování v jazyce Python

Jazyk C# (seminář 6)

Binární vyhledávací stromy II

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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.

Zpracoval:

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

6 Objektově-orientovaný vývoj programového vybavení

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

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/

"Václav Klaus". public class Clovek { protected String jmeno; protected int roknarozeni; public Clovek(String j, int rn) {

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

DUM 06 téma: Tvorba makra pomocí VBA

Abstraktní třídy, polymorfní struktury

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Transkript:

Programování II Dědičnost změna chování 2018/19

Osnova přednášky Rozšíření chování. Změna chování. Příklad.

Rozšíření chování

Když rozšiřujeme chování Můžeme bezpečně použít to, co už máme. Nehrozí žádný problém s pochopením, jak se objekt chová. Objekt vystupuje sám za sebe nebo za některého ze svých předků.

Paradox specializace a rozšíření Vztah dědičnosti je vztahem obecný - speciální. Potomek je tedy speciálním případem předka. Při rozšíření ale dochází k tomu, že potomek umí více, než kterýkoli jeho předek.

a tedy Čím bohatší chování uvažujeme, tím méně tříd ho poskytuje. V dědičné hierarchii je nejmenší společné chování definováno ve společném předkovi. Koncové třídy této hierarchie mají nejbohatší chování (každá trochu jiné).

Špatný příklad Potřeba rozšíření sama o sobě není dostačující pro použití dědičnosti. Např. vztah bodu a kružnice, mohli bychom potřebovat rozšířit bod o práci s poloměrem (nové chování). Je to dostatečné, abychom se rozhodli použít dědičnost?

Ne!!! Není splněna podmínka specializace (kružnice není speciálním případem bodu).

Změna chování

Změna chování Pokud je chování deklarováno v předkovi, můžeme ho v potomkovi deklarovat znovu. Deklarované chování pak musíme v potomkovi implementovat (aby bylo proveditelné). Deklarované chování nemusí být implementované v předkovi.

Přetížení jako rozšíření chování

Přetížení Přetížením rozumíme situaci, kdy daná metoda má stejné jméno, ale má: jiné parametry, jiné typy parametrů, Jiný typ návratové hodnoty. Přetížení není změna chování, a to i přesto, že metoda má stejné jméno.

Typy přetížení Jméno metody zůstává stejné. Jiný počet parametrů. Jiné datové typy parametrů. Jiná návratová hodnota (ne v C++). Lze kombinovat.

Překrytí Překrytím rozumíme situaci, kdy metoda potomka má stejnou deklaraci, jako metoda předka (stejnou signaturu). Potomek dědí i metodu předka. Má tedy dvě metody se stejnou deklarací.

Kdy použít překrytí? Typickým příkladem použití přetížení jsou konstruktory. Typickým příkladem použití překrytí je opravdová změna chování potomka. Příkladem může být metoda na výběr peněz z různých typů účtů v bance.

Příklad

Deklarace předka

Překrytí Deklarujeme třídu CreditAccount. Překryjeme metodu CanWithdraw. Má stejnou signaturu, ale jinou definici. Důsledek: Ve třídě CreditAccount bude instanční metoda CanWithdraw dvakrát!!!

Deklarace potomka

Definice

Definice (připomenutí)

Použití

Výsledek?

Jsme hotovi? NE!!! Jak vybereme z účtu (pokud můžeme), když nemáme přístup k členské proměnné balance? Jaké máme možnosti?

Vlastní metoda?

Máme problém

Jaké tedy máme možnosti? Public přístup k datové položce? Porušení zapouzdření? Nebo jinak?

Nový předek

Funguje, jenže Máme stejný kód dvakrát. Porušujeme zapouzdření. Při zastoupení předka potomkem se použijí různé metody

Výsledek

Porušení zapouzdření Při změně chování může vzniknout potřeba pracovat se soukromou částí předka. Jedná se samozřejmě o porušení zapouzdření a toho si musíme být vědomi nicméně každé rozumné pravidlo má nějaké výjimky.

Dá se zavolat metoda předka? Je to stejné jako volání statické metody Z potomka voláme originální metodu. Account::CanWithdraw(a);

Úkoly na cvičení Implementujte příklady z přednášky. Zaměřte se na překrytí, vyzkoušejte použití protected. Navrhněte a implementuje jednoduchou dědičnou hierarchii geometrických objektů, které budou mít společné metody Obsah a Obvod. Využijte překrytí a rozeberte chování při využití substitučního principu.

Kontrolní otázky Co rozumíme paradoxem specializace a rozšíření? Uveďte správné a špatné příklady vztahu "generalizace-specializace". Co rozumíme v dědičnosti změnou chování? Co rozumíme přetížením? Jedná se o rozšíření nebo změnu chování? Uveďte různé typy přetížení. Co rozumíme překrytím? Jedná se o rozšíření nebo změnu chování? Jaký princip porušujeme, použijeme-li protected a proč? Jaký problém přináší potřeba změny chování v dědičnosti? Popište, jak se prakticky projevuje různá míra přístupu k položkám třídy. Jak se použití protected projeví ve vztahu předka a potomka?

Ke studiu Bertrand Meyer. Object-Oriented Software Construction. Prentice Hall 1997. [459-467]