Programování II. Polymorfismus

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

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

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

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

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

Programování II. Návrh programu II

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

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

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

Virtuální metody - polymorfizmus

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

Dědění, polymorfismus

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

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

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

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

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Programování II. Modularita 2017/18

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

Jazyk C++ I. Polymorfismus

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

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

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

Programování v C++ VI

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

1. Dědičnost a polymorfismus

20. Projekt Domácí mediotéka

PB161 Základy OOP. Tomáš Brukner

Objektové programování

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

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

Generické programování

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

Anotace. Objekt self, Zapouzdření, polymorfismus,

Základy objektové orientace I. Únor 2010

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

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

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++ 2, 4. cvičení

PB přednáška (21. září 2015)

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.

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

Více o konstruktorech a destruktorech

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

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

PREPROCESOR POKRAČOVÁNÍ

Abstraktní třídy, polymorfní struktury

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.

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

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

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

Jazyk C# (seminář 3)

Zpracování deklarací a přidělování paměti

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

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

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

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.

Mělká a hluboká kopie

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

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

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda

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

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

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 8

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

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

Delphi - objektově orientované

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

9. Polymorfismus a rozhraní

Úvod do programovacích jazyků (Java)

Zpracoval:

Dynamická identifikace typů v C++.

Konstruktory a destruktory

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

Nepravidlové a hybridní znalostní systémy

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

Výčtový typ strana 67

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

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

Objektově orientované programování

Ukazka knihy z internetoveho knihkupectvi

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

OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

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

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

Dědičnost. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Aleš Hrabalík a Martin Hořeňovský, 2016

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

typová konverze typová inference

Programování v jazyce JavaScript

přetížení operátorů (o)

Abstract Factory úvod

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Quo vadis programování? Automatizace vyhodnocování studentských úloh

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

, Brno Připravil: David Procházka Návrhové vzory

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/

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

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

Transkript:

Programování II Polymorfismus

Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad.

Přetížení, překrytí, protected

Přetížení x překrytí Přetížením řešíme doplnění chování. Jedná se o rozšíření, byť má metoda stejné jméno. Překrytím řešíme opravdovou změnu chování. Polymorfismus je ještě něco navíc

Problém změny chování Mnohdy potřebujeme přistupovat k detailům implementace. Detaily implementace by ale měly být skryty. Dá se přistoupit k soukromým položkám předka (předků)?

Přístup ke stavu a chování public private protected klient x - - třída x x x potomek x - x

Protected přístup Přístup k detailům implementace můžeme řešit využitím protected. Je to ale správné? Nebo je to špatně? A proč?

Použití protected porušuje zapouzdření Důsledky: Rozhodneme-li se změnit implementaci předka, může se to dotknout implementace potomka. Potomek se stává implementačně závislým na předkovi (a platí to i naopak).

Co je polymorfismus?

Polymorfismus Polymorfismus je schopnost objektu vystupovat v různých rolích (formách) a podle toho se chovat. Souvisí to se substitučním principem, tedy se zastupitelností předka potomkem.

Polymorfní přiřazení Zdroj přiřazení je jiného typu než cíl přiřazení.

Vlastnost polymorfního přiřazení

Překrytí x polymorfismus Zajišťuje nám obyčejné překrytí to, že se jedná polymorfismus? NE! Proč?

Bez protected? Jak jinak získat přístup k soukromým položkám předka? Když jsou tyto položky pro potomka díky private skryty Co vlastně chceme? Vraťme se o krok zpět

Funguje to?

Ne tak, jak očekáváme

Časná vazba Překladač za normálních okolností využívá tzv. časnou vazbu (early binding), která při volání metody vyhodnocuje typ instance již v době překladu. V metodě Withdraw se zavolá metoda CanWithdraw předka.

Pozdní vazba Potřebujeme zjistit, kdo metodu žádá, ale až v okamžiku volání. To v našem případě nelze, protože je použita časná vazba. K tomu slouží pozdní vazba (late binding).

Příklad

Virtuální metody Chceme-li se přenechat rozhodnutí, která překrytá metoda bude volána, až v průběhu programu, musíme metodu označit klíčovým slovem virtual. Dáváme překladači najevo, že si přejeme využít dynamickou nebo také pozdní vazbu (late binding) Jednou označená metoda jako virtuální zůstává virtuální ve všech potomcích.

Tabulka virtuálních metod Jakmile některou metodu definujeme jako virtuální, překladač přidá ke třídě neviditelný ukazatel, který ukazuje do speciální tabulky nazvané tabulka virtuálních metod (VMT). Pro každou třídu, která má alespoň jednu virtuální metodu, překladač vytvoří tabulku virtuálních metod. Tabulka obsahuje ukazatele na metody. Tabulka je společná pro všechny instance dané třídy.

Virtuální konstruktor? NE! Před jejich voláním není ještě vytvořen odkaz do VMT. Uvnitř konstruktorů sice můžeme volat virtuální metody, ale ty se budou chovat nevirtuálně.

Virtuální destruktor? ANO! Který destruktor se v uvedeném případě zavolá? Je to správně? A proč?

Polymorfismus Polymorfismus je spojen s dědičností. Nemá smysl mluvit o polymorfismu, pokud nepoužijeme virtuální metody. Jde stále o zastupitelnost předka potomkem.

Virtuální metody Potomek využívá virtuální metodu v různých kontextech. Tedy v případě, že je použita v kterékoli metodě kteréhokoli předka. Využívá se, na rozdíl od pouhého překrytí, i při polymorfním přiřazení.

Polymorfní datové struktury Struktura která obsahuje objekty různých tříd. Např. pole, seznam,, který je typu Předek Po takto uložených objektech můžeme požadovat (volat) pouze společné metody předka. Jak volat ostatní metody? Je nutno přetypovat je to jedno z omezení polymorfismu.

Úkoly na cvičení Implementuje příklady z přednášky, zaměřte se na využití virtuální metody a pochopení, jak funguje při polymorfním přiřazení. Navrhněte a implementuje jednoduchou dědičnou hierarchii geometrických objektů, které budou mít společné virtuální metody Obsah a Obvod. Využijte polymorfní datovou strukturu (např. pole ukazatelů) a rozeberte chování při využití substitučního principu (zejména při srovnání s obyčejným překrytím).

Otázky Co rozumíme polymorfismem a s čím to souvisí? Co rozumíme polymorfním přiřazením? Co je časná vazba? Uveďte příklady. Co je pozdní vazba? Uveďte příklady. Popište, co je virtuální metoda a její vlastnosti. Popište, co je tabulka virtuálních metod a jak funguje. Může být konstruktor virtuální? A proč? Může být destruktor virtuální? A proč? Kdy mluvíme v C++ o polymorfismu a jak se to projeví v návrhu? Co je polymorfní datová struktura a k čemu ji využíváme? Kdy potřebujeme virtuální destruktor? S čím to souvisí?

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