7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Podobné dokumenty
Programování II. Polymorfismus

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

Objektové programování

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

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

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

Delphi - objektově orientované

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

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

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

dovolují dělení velkých úloh na menší = dekompozice

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

NPRG030 Programování I, 2015/16 1 / :25:32

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Virtuální metody - polymorfizmus

Dědění, polymorfismus

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

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

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

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

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

Objektově orientované programování v jazyce Python

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Programování II. Návrh programu II

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.

Více o konstruktorech a destruktorech

Objektově orientované programování v jazyce Python

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

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

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

Sada 1 - Základy programování

Jazyk C++ I. Polymorfismus

Základy objektové orientace I. Únor 2010

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

Sdílení dat mezi podprogramy

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

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

1. Dědičnost a polymorfismus

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Programování v C++ VI

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

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

Objektově orientované programování (OOP) je po strukturovaném programování

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Programovací jazyk Pascal

Objektově orientovaný přístup

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

Třídy a struktury v C++

PB161 Základy OOP. Tomáš Brukner

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

20. Projekt Domácí mediotéka

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

Programování v jazyce C a C++

Anotace. Pointery. Martin Pergel,

Výčtový typ strana 67

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

Programování v jazyku LOGO - úvod

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

TEDrv OVLADAČE KLÁVESNICE, MYŠI A DISPLEJE EMULÁTORU TERMINÁLU PRO MS WINDOWS. Příručka uživatele a programátora

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

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

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

PREPROCESOR POKRAČOVÁNÍ

Konstruktory a destruktory

DUM 06 téma: Tvorba makra pomocí VBA

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

1 Základy algoritmizace a programování. 1.1 Algoritmus Možnosti zápisu algoritmů. Základy algoritmizace a programování

MS SQL Server 2008 Management Studio Tutoriál

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

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

Assembler - 5.část. poslední změna této stránky: Zpět

Projekt Obrázek strana 135

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

Programování v jazyce JavaScript

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

1. Programování proti rozhraní

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í. Úvod

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

typová konverze typová inference

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

NMIN102 Programování /2 Z, Zk

Struktura programu v době běhu

Ukazka knihy z internetoveho knihkupectvi

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

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

Nepravidlové a hybridní znalostní systémy

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

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

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 C++ Výjimky Bezpečné programování

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

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

Transkript:

Page 1 of 7 7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ 1. Úvod 2. Obalení 3. Dědičnost 4. Polymorfismus 5. Statické a virtuální metody 6. Dynamické objekty 7.1 ÚVOD Objektově orientované programování (dále jen OOP) představuje v dnešní době novou metodu vytváření programů oproti klasické metodě strukturovaného programování. Metody OOP napodobují vzhled a chování objektu z reálného světa s možností velké abstrakce. Přínosem OOP je také větší strukturovanost a modularita vytvářeného programu. Objektově orientovaný přístup tvorby programu je charakterizován třemi základními vlastnostmi: 7.2 OBALENÍ Obalení (zapouzdření) encapsulation: je realizováno novým datovým typem objekt, který vzniknul kombinací standardního datového typu záznam (record) a datového typu procedura (funkce). Obsahuje tedy kromě datových položek také řídící struktury metody. Oním obalením tedy mužeme rozumět obalení datových položek řídícími strukturami metodami, které zajišťují přístup k datovým položkám. Dobrý programátor by měl připravit dostatečný počet metod, aby uživatel neměl potřebu přímo přistupovat k datovým položkám. Příklad: type MujNovyObjekt = object X, Y, Z : integer; - datová položka Velikost : real; - datová položka procedure - metoda ZjistiPozici; function - metoda ZjistiVelikost; Jak vidíme z výpisu části programu, je datový typ objekt označen vyhrazeným slovem object a jeho syntaxe je obdobná jako syntaxe datového typu záznam. V předchozím výpisu byla provedena nepřesnost vůči definici obalení. Uživatel totiž nedisponuje žádnou metodou, která by vložila počáteční hodnoty do proměnných X, Y a Z.

Page 2 of 7 Musíme tedy takovou metodu dodefinovat, aby definice předchozího objektu byla kompletní a odpovídala definici obalení. Výsedek bude vypadat následovně: type MujNovyObjekt = object X, Y, Z : integer; Velikost : real; procedure Init(Xi, Yi, Zi : integer); procedure ZjistiPozici; function ZjistiVelikost; Takto upravená definice objektu již vyhovuje definici obalení. Nabízí se zde ještě jeden způsob, jak nepovolit v případech, kdy je to nezbytně nutné, přístup přímo k datovým položkám. Můžeme to provést tím způsobem, že všechny datové položky, které chceme takto upravit, přesuneme do části private. Ilustruje to následující příklad: type MujNovyObjekt = object procedure Init(Xi, Yi, Zi : integer); procedure ZjistiPozici; function ZjistiVelikost; private X, Y, Z : integer; Velikost : real; Metody, které jsme použili v předchozí definici objektu, zde uvádějí pouze své hlavičky. Jejich deklarace následuje až za definicí objektu. V této deklaraci je kromě identifikátoru metody uveden ještě identifikátor objektu, který je oddělen od identifikátoru metody tečkou. Ukážeme si to na deklaraci metody Init, která má svou hlavičku v předchozí definici objektu MujNovyObjekt. procedure MujNovyObjekt.Init(Xi, Yi, Zi : integer); X := Xi; Y := Yi; Z := Zi; V těle metody jsou všechny datové položky objektu přímo přístupné bez předpony jména objektu. Chceme tím říci to, že použitím identifikátoru MujNovyObjekt v hlavičce metody jasně víme, kterého objektu jsou dané datové položky. Pokud by mělo dojít ke konfliktu, který může nastat, pokud se v metodě současně objeví datové položky stejných jmen dvou různých objektů, můžeme pro odlišení použít automaticky předávaný identifikátor Self, což je ukazatel na daný objekt, kterému datové složky přísluší. Zápisem Self.X nebo Self.Y tedy jednoznačně pojmenujeme a odlišíme datovou položku od jiné datové položky jiného objektu. 7.3 DĚDIČNOST Dědičnost inheritance: umožňuje vytvářet nové objekty jako potomky již existujících

Page 3 of 7 objektů předků, přebírat od nich datové položky a metody a modifikovat je či upřesňovat. Takto vzniká stromová struktura objektů. Demonstrovat si ji můžeme na následujícím příkladu. Nadefinujeme si nový objekt Lokace, který obsahuje pouze proměnné pro uložení aktuální pozice. Poté následuje definice dalšího objektu, a to objektu Bod, který je potomkem objektu Lokace a přidává navíc ještě vlastnost viditelnosti objektu. Poté již následují definice obrazců, které dědí vlastnosti objektu Bod, neboť se z bodů skládají nebo jsou jimi tvořeny. type Lokace = object X : integer; Y : integer; Bod = object(lokace) Stav : boolean; Kruh = object(bod) procedure Init(Xi, Yi, Polomer : integer); procedure Zobraz; atd. Celou hierarchii dědičnosti si můžeme ukázat pomocí diagramu: Jeden objekt - předek může mít mnoho potomků, avšak jeden potomek může mít pouze jednoho předka. 7.4 POLYMORFISMUS Polymorfismus (mnohotvarost) - polymorphism: je úzce spjat s předchozí vlastností OOP, a to s dědičností. Polymorfismus je vlastnost OOP, která umožňuje pojmenovat metodu jedním jménem a tato metoda může být společná pro různé objekty ve stromové hierarchii, i když pro každý objekt v této hierarchii se bude chovat různě. Jinak řečeno: polymorfismus umožňuje, aby každý objekt ve stromové hierarchii objektů (viz obrázek výše) volal metodu se stejným jménem. Přitom může mít každý objekt tuto metodu jinak definovanou. Výsledkem je, že pro každý objekt ve stromové hierarchii bude mít volání metody jinou odezvu, avšak pro každý objekt vždy tu správnou.

Page 4 of 7 Práce s objekty v programu je stejná jako s datovým typem záznam. To znamená, že pokud budeme přistupovat k datovým položkám či k metodám objektu, použijeme tečkovou konvenci nebo příkaz with. Ukážeme si to na následujícím výpisu. var MNO : MujNovyObjekt; i : integer; i := 0; MNO.Init(i, i+1, i+2); with MNO do inc(i); ZjistiVelikost; 7.5 STATICKÉ A VIRTUÁLNÍ METODY Všechny metody, které jsme si uváděli výše, jsou statické metody. Mužeme je přirovnat ke statickým proměnným. Překladač jim vyhradí místo v paměti již v době překladu a také řeší všechny vztahy mezi metodami a objekty již v době překladu. Těmto vztahům se říká early binding - brzká vazba. Díky těmto vlastnostem jsou statické metody velmi rychlé při jejich vykonávání a jejich kód je velice efektivní. Avšak právě díky statickým metodám může dojít k problému, který si ukážeme na následujícím příkladě. program Kresleni; type Lokace = object X : integer; Y : integer; var B : Bod; K : Kruh; Bod = object(lokace) Stav : boolean; procedure Init; procedure Zobraz; Kruh = object(bod) procedure Init; procedure Zobraz; procedure Vykresli(Co : Bod);

Page 5 of 7 Co.Zobraz; BEGIN Vykresli(K); END. Trošku jsme, vzhledem k nastínění problému, upravili definice objektů Bod a Kruh. V hlavním programu požadujeme, aby procedura Vykresli vykreslila objekt, který je určen jako parametr této procedury. Program je po syntaktické stránce správný, poněvadž za formální parametr Co typu Bod můžeme dosadit skutečný parametr K typu Kruh. Problém nastává až v tomto místě. Protože metoda Zobraz je statická metoda, překladač určuje její adresu již v době překladu. Překladač tedy při překladu zjistí, že formální parametr Co je typu Bod a dosadí tedy při překladu volání metody Zobraz adresu metody Bod.Zobraz. I když bude skutečným parametrem Kruh, bude volána metoda objeku Bod. Tento problém řeší až virtuální metody. Virtuální metody nabízejí pro řešení těchto situací možnosti vytvářet vazby mezi objekty a jejich metodami až v době výpočtu. Těmto vazbám se říká late binding - pozdní vazba. Tyto metody jsou pomalejší při vykonávání než metody statické. Virtuální metody řeší pojem zvaný polymorfismus. Díky těmto metodám můžeme pojmenovat jedním jménem metodu, která je stejná pro všechny objekty ve stromové hierarchii, avšak pro každý objekt má tato metoda jinou implementaci. A nyní již konkrétněji. Virtuální metoda se označuje v objektu direktivou virtual. Adresa této metody je uložena v tabulce virtuálních metod (dále jen VMT - z anglického Virtual method table). Potřebujeme-li vyvolat nějakou metodu, její adresa je nalezena právě v této tabulce. VMT musí být naplněna ještě předtím, než se s objektem začne vůbec pracovat. K naplnění tabulky VMT slouží speciální metoda, zvaná konstruktor. V definici objektu se používá místo vyhrazeného slova procedure slovo constructor. Konstruktor inicializuje mechanismus virtuálních metod. Konstruktor se musí vyskytovat v definici každého objektu, který využívá alespoň jednu virtuální metodu. Než je jakákoliv virtuální metoda daného objektu použita, je nutné spustit metodu konstruktoru. Pokud bychom to neudělali, došlo by k zablokování programu. Metoda, definovaná v objektu jako virtuální, musí být definovaná i ve všech potomcích tohoto objektu jako virtuální. Upravíme-li tedy náš předchozí jednoduchý program pomocí virtuálních metod, bude již pracovat správně a metoda Zobraz v proceduře Vykresli bude volána ze správného objektu. program Kresleni; type Lokace = object X : integer; Y : integer; Bod = object(lokace) Stav : boolean;

Page 6 of 7 var B : Bod; K : Kruh; Kruh = object(bod) procedure Vykresli(Co : Bod); Co.Zobraz; BEGIN K.Init; Vykresli(K); END. 7.6 DYNAMICKÉ OBJEKTY Stejně tak jako proměnné mohou být statické či dynamické, tak i instance objektů mohou být statické (jak jsme si ukázali výše) i dynamické. Abychom se však nezmýlili v pojmech. Slovo statické se v tomto případě nevztahuje na metody objektu. Statické objekty mohou obsahovat jak statické, tak i virtuální metody. Stejně i dynamické metody mohou obsahovat statické i virtuální metody. Dynamickým metodám je při jejich vzniku vymezen paměťový prostor haldy a odkazujeme se na ně pomocí ukazatele. Při práci s instancí dynamického objektu musíme stejně jako při práci s dynamickou proměnnou přidělit této instanci volnou paměť pomocí procedury New. Stejně tak pokud instance objektu obsahuje byť jedinou virtuální metodu, musíme nejprve zinicializovat VMT pomocí metody constructor. Metodu, definovanou v daném objektu, spouštíme v programu tak, že za jménem instance objektu následuje operátor nepřímé adresace ^ s tečkou a dále pak jméno volané metody. Na konci programu musíme paměť přidělenou objektu opět uvolnit. Toho docílíme pomocí nám již známé procedury Dispose. type Kruh = object(bod) var K : ^Kruh; BEGIN New(K);

Page 7 of 7 K.Init;... K^.Zobraz;... Dispose(K); END. Pomocí procedury Dispose jsme zrušili instanci dynamického objektu z paměti. Někdy však může nastat situace, kdy objekt uvnitř sebe obsahuje jiné dynamické struktury, které při rušení objektu z haldy je třeba zrušit také. Takovou strukturou, která ruší z haldy všechny dynamické struktury objektu včetně instance objektu samého, je metoda destruktor. V definici objektu se používá vyhrazené slovo destructor. type Kruh = object(bod) destructor Done; virtual; Destruktor mohou dědit všichni potomci daného objektu. Je vhodné definovat tuto matodu jako virtuální, může se takto zajistit správné uvolnění paměti přidělené instanci dynamického objektu. U polymorfních objektů, tedy u takových objektů, kdy předek i potomek vlastní metody stejných názvů, ale jiných implementací (viz úvodní kapitola o polamorfismu), se může stát, že polymorfní objekt může být přiřazen instanci typu předka, avšak obě instance v paměti zaujímají různý prostor. Procedura Dispose neví, kolik paměti se má uvolnit. Proto tuto proceduru rozšiřujeme o metodu destruktoru, který přesně ví, která paměť se má uvolnit, protože si to destruktor dokáže zjistit z VMT. Až poté lze uvolnit paměť po instanci polymorfního dynamického objektu. Rozšířená procedura pak vypadá takto: Dispose(K, Done);