Objektově orientované programování
Z MiS
(Rozdíly mezi verzemi)
(→Příklady použití rysů OOP v knihovnách Javy: Opraven vzhled i příklady.) |
(→Zdroje: Doplněno ITnetwork.cz.) |
||
(Není zobrazeno 14 mezilehlých verzí od 1 uživatele.) | |||
Řádka 2: | Řádka 2: | ||
== Co je to OOP? == | == Co je to OOP? == | ||
− | *Objektově orientované programování ( | + | * Objektově orientované programování (OOP, anglicky Object-Oriented Programming) je to ''[[Pojmy Softwarového inženýrství#Metodika|metodika vývoje softwaru]]''. |
− | + | *Zároveň se jedná o ''[[Pojmy Softwarového inženýrství#Paradigma|paradigma]]'': popisuje ''způsob vývoje a zápisu programu a způsob uvažování o problému''. | |
− | *Zároveň se jedná o paradigma: popisuje způsob vývoje a zápisu programu a způsob uvažování o problému. | + | |
== Základní paradigma OOP == | == Základní paradigma OOP == | ||
Řádka 14: | Řádka 14: | ||
*Pro srovnání: strukturované programování | *Pro srovnání: strukturované programování | ||
**Řešení úlohy jako posloupnost příkazů, řídících struktur a volání metod. | **Řešení úlohy jako posloupnost příkazů, řídících struktur a volání metod. | ||
+ | |||
== Cíle == | == Cíle == | ||
*Je vedeno snahou o znovupoužitelnost komponent. | *Je vedeno snahou o znovupoužitelnost komponent. | ||
− | * | + | *Rozkládá složitou úlohu na dílčí součásti, které jdou pokud možno řešit nezávisle. |
− | *Přiblížení struktury řešení reálnému světu. | + | *Přiblížení struktury řešení v počítači reálnému světu (komunikující objekty). |
+ | *Skrytí detailů implementace řešení před uživatelem řešení. | ||
+ | |||
+ | <div class="Priklad">Představte si, že někdo vytvořil knihovnu, která řeší obecnou úlohu (třeba <tt>ArrayList</tt> v Javě, fungující jako úložiště objektů). | ||
+ | |||
+ | Když tuto knihovnu chcete použít, potřebujete vědět: | ||
+ | * hodnotu kterých proměnných můžete měnit, | ||
+ | * které metody/funkce/procedury smíte volat. | ||
+ | |||
+ | To samozřejmě lze napsat do dokumentace. OOP je však vedeno snahou, aby zodpovězení těchto otázek bylo přirozenou součástí kódu. | ||
+ | </div> | ||
+ | |||
== Model systému pohledem OOP (konstrukty OOP) == | == Model systému pohledem OOP (konstrukty OOP) == | ||
Řádka 24: | Řádka 36: | ||
*Základní pojem. | *Základní pojem. | ||
*Model světa pohledem OOP je množina objektů (entit), které si posílají zprávy. | *Model světa pohledem OOP je množina objektů (entit), které si posílají zprávy. | ||
− | ; | + | ; Zpráva |
− | *pokud chce objekt komunikovat s jiným objektem, | + | *pokud chce objekt komunikovat s jiným objektem, posílá mu zprávu |
− | + | ||
− | + | ; Rozhraní objektu/třídy | |
− | ; | + | *Množina zpráv, na kterou umí daný objekt reagovat. |
+ | |||
+ | ; Třída | ||
*Třída je seskupení objektů stejného typu. | *Třída je seskupení objektů stejného typu. | ||
− | * | + | *Podchycuje na obecné úrovni podstatu všech objektů podobného typu |
*Třída je „šablona“ pro vytváření objektů. | *Třída je „šablona“ pro vytváření objektů. | ||
− | *Objekt | + | |
+ | ; Instance | ||
+ | *Objekt dané třídy nazýváme někdy také ''instancí'' třídy. | ||
+ | |||
; Atributy | ; Atributy | ||
*Každá entita modelovaného světa má vlastnosti. | *Každá entita modelovaného světa má vlastnosti. | ||
*Ty vlastnosti, které jsou pro náš model podstatné, zachycujeme pomocí atributů. | *Ty vlastnosti, které jsou pro náš model podstatné, zachycujeme pomocí atributů. | ||
+ | |||
; Stav objektu | ; Stav objektu | ||
*aktuální hodnoty jeho atributů. | *aktuální hodnoty jeho atributů. | ||
+ | |||
== Rysy OOP == | == Rysy OOP == | ||
− | ; Abstrakce (abstraction) | + | |
+ | ; Abstrakce (''abstraction'') | ||
*objekt pracuje jako „černá skříňka“ | *objekt pracuje jako „černá skříňka“ | ||
− | + | *objekt můžeme používat aniž bychom znali detaily jeho fungování | |
− | + | *implementaci objektu lze změnit, pokud nezměníme rozhraní, zbytek kódu nemusíme měnit | |
− | ; Zapouzdření (encapsulation) | + | |
− | *objekt může přistupovat k | + | ; Zapouzdření (''encapsulation'') |
+ | *objekt může přistupovat k atributům jiných objektů pouze pomocí zasílání zpráv! | ||
*„data a funkce dohromady“ | *„data a funkce dohromady“ | ||
− | ; Polymorfismus (polymorphism) | + | |
+ | ; Polymorfismus (''polymorphism'') | ||
*různé objekty mohou reagovat na stejnou zprávu různě | *různé objekty mohou reagovat na stejnou zprávu různě | ||
*„když dva dělají totéž, není to totéž“ | *„když dva dělají totéž, není to totéž“ | ||
− | ; Skládání (agregation) | + | |
+ | ; Skládání (''agregation'') | ||
*objekt může jako své součásti obsahovat jiné objekty | *objekt může jako své součásti obsahovat jiné objekty | ||
− | ; Delegování (delegation) | + | |
+ | ; Delegování (''delegation'') | ||
*pro provedení operace objekt část akce řeší voláním dalších objektů | *pro provedení operace objekt část akce řeší voláním dalších objektů | ||
− | |||
− | |||
− | |||
− | |||
− | == | + | ; Dědičnost (''inheritance'') |
+ | * pokud objekt sdílí a rozšiřuje rozhraní jiného objektu, popisujeme to dědičností | ||
+ | * dědičnost používáme pouze tehdy, kdy objekt přebírá (a případně rozšiřuje o nové zprávy) CELÉ rozhraní jiného objektu (jinak používáme skládání + delegování) | ||
+ | * potomek může zároveň kdykoli zastoupit předka | ||
+ | |||
+ | |||
+ | == Použití konstruktů OOP v programovacích jazycích == | ||
+ | |||
+ | Syntaxe Javy viz [[Java: Zápis tříd]]. | ||
+ | |||
=== Objekty, třídy === | === Objekty, třídy === | ||
*Každý objekt je instancí některé třídy | *Každý objekt je instancí některé třídy | ||
− | *univerzální předek | + | *Často bývá jedna třída univerzální předek (například v Javě třída <code>Object</code>), ostatní třídy jsou pak potomky této třídy nebo potomky jejích potomků. |
− | + | ||
− | ; Vytváření objektů | + | ; Vytváření objektů (instancí třídy) |
− | *operátor new | + | * Ve většině jazyků se používá operátor <code>new</code>. |
− | *konstruktor | + | * Při vytváření instance se volá konstruktor, který inicializuje hodnoty atributů. |
− | ** | + | |
− | === Zprávy === | + | ; Konstruktor |
+ | * Konstruktor se obvykle zapisuje podobně jako metoda, ale nemá uvedené jméno, návratovým typem je třída sama. | ||
+ | * Třída může mít více konstruktorů. | ||
+ | * Pokud neuvedeme konstruktor, vytváří se obvykle tzv. „implicitní konstruktor“. Ten nastaví hodnoty proměnných na úvodní hodnoty podle jejich typu | ||
+ | |||
+ | === Zprávy → metody === | ||
* Reakci objektu na zprávu popisují metody: | * Reakci objektu na zprávu popisují metody: | ||
; Metoda má: | ; Metoda má: | ||
* název | * název | ||
− | * parametry (mají typ a název) | + | * parametry (mají [[Java: Datové typy|typ]] a název) |
− | * návratový typ (používá se klíčové slovo <code>return</code>) | + | * návratový [[Java: Datové typy|typ]] (používá se klíčové slovo <code>return</code>) |
− | ; Přetěžování metod (overloading) | + | ; Přetěžování metod (''overloading'') |
*Jedna třída může mít více metod se stejným jménem. | *Jedna třída může mít více metod se stejným jménem. | ||
− | *Metody se stejným jménem se musí lišit | + | *Metody se stejným jménem se musí lišit počtem parametrů, [[Java: Datové typy|typem]] parametrů nebo obojím. |
− | + | ; Překrývání metod (''overlaying'') | |
− | + | * souvisí s dědičností a polymorfismem | |
− | + | * potomek může na stejnou zprávu reagovat jinak, než předek | |
− | ; Překrývání metod (overlaying) | + | * pak říkáme, že metoda v potomkovi „překrývá“ metodu předka |
− | *souvisí s dědičností a polymorfismem | + | |
− | *potomek může na stejnou zprávu reagovat jinak, než předek | + | |
− | + | ||
; Atomizace metod | ; Atomizace metod | ||
*metoda by měla řešit jednu konkrétní věc | *metoda by měla řešit jednu konkrétní věc | ||
*pro dílčí podúkoly by měla delegovat volání na další metody či jiné objekty | *pro dílčí podúkoly by měla delegovat volání na další metody či jiné objekty | ||
*délka metody bez deklarace proměnných cca 5 řádků | *délka metody bez deklarace proměnných cca 5 řádků | ||
− | === Atributy === | + | |
+ | === Atributy → proměnné === | ||
*Atributy jsou realizovány proměnnými. | *Atributy jsou realizovány proměnnými. | ||
; Instanční proměnné | ; Instanční proměnné | ||
*Každá instance má svoji vlastní hodnotu. | *Každá instance má svoji vlastní hodnotu. | ||
− | |||
*Zabírají paměť tolikrát, kolik instancí třídy vytvoříme. | *Zabírají paměť tolikrát, kolik instancí třídy vytvoříme. | ||
+ | <div class="Priklad">Například třída <code>UcebniSkupina</code> může mít atribut <code>počet žáků</code> (kteří do dané skupiny chodí). Odpovídající proměnná musí být instanční, protože každá učební skupina může mít jiný počet žáků. (Je to vlastnost konkrétní skupiny.)</div> | ||
; Třídní proměnné | ; Třídní proměnné | ||
* klíčové slovo <code>static</code> | * klíčové slovo <code>static</code> | ||
*Hodnota je společná pro všechny instance dané třídy. | *Hodnota je společná pro všechny instance dané třídy. | ||
− | |||
*Zabírají paměť jen jednou, bez ohledu na počet instancí. | *Zabírají paměť jen jednou, bez ohledu na počet instancí. | ||
− | + | <div class="Priklad">Je-li <code>maximální počet žáků</code> v učební skupině dán zákonem (tedy pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy <code>UcebniSkupina</code>.</div> | |
− | + | ||
− | + | Více o vztahu mezi instančními a třídními proměnnými viz: [[Platnost proměnných]]. | |
− | + | ||
− | + | === Přístupnost metod a proměnných === | |
− | ** | + | * Metody a proměnné mohou být přístupné: |
− | * | + | ** pouze z dané třídy |
− | ** | + | ** pouze ze tříd ve stejném balíčku |
+ | ** navíc z potomků třídy | ||
+ | ** z libovolné třídy | ||
+ | * Přístupnost určují obvykle modifikátory (viz syntaxe v Javě v [[Java: Modifikátory přístupu]]). | ||
+ | |||
=== Dědičnost === | === Dědičnost === | ||
− | * | + | * V mnoha jazycích se omezuje dědičnost na dědění maximálně z jedné třídy. Tím se vyhneme některým problémům při implementaci. |
− | * | + | |
+ | === Zastupitelnost tříd === | ||
+ | * V jazycích, které vyžadují typovou kontrolu v době překladu, je často třeba předem uvést typ objektů, které budeme například vkládat do [[Java: Kontejnery|kontejneru]]. | ||
+ | * My ale často potřebujeme vkládat objekty různých tříd. | ||
+ | * K řešení můžeme využít: | ||
+ | ** rozhraní | ||
+ | ** abstraktní třídy | ||
+ | ** dědičnost | ||
+ | |||
=== Abstraktní třída === | === Abstraktní třída === | ||
− | |||
*Některé metody jsou abstraktní: | *Některé metody jsou abstraktní: | ||
**nemají tělo | **nemají tělo | ||
Řádka 117: | Řádka 159: | ||
*Těla abstraktních metod budou doplněna v potomcích třídy. | *Těla abstraktních metod budou doplněna v potomcích třídy. | ||
*Nelze vytvořit instanci abstraktní třídy. | *Nelze vytvořit instanci abstraktní třídy. | ||
+ | * Viz [[Java: Abstraktní třídy, dědičnost a rozhraní]]. | ||
+ | |||
=== Rozhraní (interface) === | === Rozhraní (interface) === | ||
*„Čistě abstraktní třída“. | *„Čistě abstraktní třída“. | ||
*Všechny metody jsou abstraktní. | *Všechny metody jsou abstraktní. | ||
− | |||
*Třída může implementovat více rozhraní. | *Třída může implementovat více rozhraní. | ||
+ | * Viz [[Java: Abstraktní třídy, dědičnost a rozhraní]] | ||
+ | |||
<div class="Poznamka"> | <div class="Poznamka"> | ||
Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!<br /> | Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!<br /> | ||
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface. | Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface. | ||
</div> | </div> | ||
+ | |||
+ | <div class="Priklad"> | ||
+ | ; Dědičnost × Skládání — Čítač příchodů | ||
+ | * Představme si, že máme již vytvořenou třídu <code>Kalkulacka</code> s metodou <code>pricti(cislo)</code>. | ||
+ | * Máme vytvořit třídu <code>CitacPrichodu</code>, která při každém průchodu dveřmi přičte do pomocné proměnné jedničku. | ||
+ | * Napadne nás, že bychom mohli použít už fungující kód třídy <code>Kalkulacka</code> | ||
+ | * Použijeme tedy instanci třídy <code>Kalkulacka</code> jako atribut třídy <code>CitacPrichodu</code>. | ||
+ | * Metoda <code>priselZakaznik()</code> bude delegovat volání na <code>kalkulacka.pricti(1)</code>. | ||
+ | * Dědičnost by zde nebyla vhodná, ostatní metody třídy <code>Kalkulacka</code> '''nemají''' být součástí rozhraní třídy <code>CitacPrichodu</code>. | ||
+ | </div> | ||
+ | |||
=== Operátory <code>this</code> a <code>super</code> === | === Operátory <code>this</code> a <code>super</code> === | ||
* <code>this</code>... odkaz na objekt, jehož metodu právě provádíme. | * <code>this</code>... odkaz na objekt, jehož metodu právě provádíme. | ||
* <code>super</code>... odkaz na rodičovskou třídu (používáme typicky v konstruktoru nebo k volání překrytých metod). | * <code>super</code>... odkaz na rodičovskou třídu (používáme typicky v konstruktoru nebo k volání překrytých metod). | ||
− | == Příklady použití rysů OOP v | + | <!-- |
+ | == Příklady použití rysů OOP v Javě == | ||
;Polymorfismus | ;Polymorfismus | ||
* <code>Component.paint()</code> | * <code>Component.paint()</code> | ||
** každá komponenta reaguje jinak | ** každá komponenta reaguje jinak | ||
** některé komponenty delegují volání na další vnořené komponenty. | ** některé komponenty delegují volání na další vnořené komponenty. | ||
− | + | --> | |
− | + | ||
− | + | == Související stránky == | |
− | + | * [[Platnost proměnných]], [[Java: Zápis tříd]] | |
− | + | ||
− | * | + | |
== Zdroje == | == Zdroje == | ||
* [http://cs.wikipedia.org/wiki/Objektově_orientované_programování Wikipedia.org > Objektově orientované programování] | * [http://cs.wikipedia.org/wiki/Objektově_orientované_programování Wikipedia.org > Objektově orientované programování] | ||
* [http://jaksenaucitprogramovat.py.cz/cztutclass.html JakseNaucitProgramovat.py.cz > Cztutclass] | * [http://jaksenaucitprogramovat.py.cz/cztutclass.html JakseNaucitProgramovat.py.cz > Cztutclass] | ||
+ | * [http://www.itnetwork.cz/java/oop ITnetwork.cz Objektově orientované programování v Javě — materiály k placenému kurzu, ale spousta materiálů je zdarma] |
Aktuální verze z 3. 2. 2017, 14:09
Obsah |
Co je to OOP?
- Objektově orientované programování (OOP, anglicky Object-Oriented Programming) je to metodika vývoje softwaru.
- Zároveň se jedná o paradigma: popisuje způsob vývoje a zápisu programu a způsob uvažování o problému.
Základní paradigma OOP
- Při řešení úlohy vytváříme model popisované reality
- popisujeme entity
- a interakci mezi entitami
- Abstrahujeme od nepodstatných detailů
- při popisu/modelování entity vynecháváme nepodstatné vlastnosti entit
- Pro srovnání: strukturované programování
- Řešení úlohy jako posloupnost příkazů, řídících struktur a volání metod.
Cíle
- Je vedeno snahou o znovupoužitelnost komponent.
- Rozkládá složitou úlohu na dílčí součásti, které jdou pokud možno řešit nezávisle.
- Přiblížení struktury řešení v počítači reálnému světu (komunikující objekty).
- Skrytí detailů implementace řešení před uživatelem řešení.
Představte si, že někdo vytvořil knihovnu, která řeší obecnou úlohu (třeba ArrayList v Javě, fungující jako úložiště objektů).
Když tuto knihovnu chcete použít, potřebujete vědět:
- hodnotu kterých proměnných můžete měnit,
- které metody/funkce/procedury smíte volat.
To samozřejmě lze napsat do dokumentace. OOP je však vedeno snahou, aby zodpovězení těchto otázek bylo přirozenou součástí kódu.
Model systému pohledem OOP (konstrukty OOP)
- Objekt
- Základní pojem.
- Model světa pohledem OOP je množina objektů (entit), které si posílají zprávy.
- Zpráva
- pokud chce objekt komunikovat s jiným objektem, posílá mu zprávu
- Rozhraní objektu/třídy
- Množina zpráv, na kterou umí daný objekt reagovat.
- Třída
- Třída je seskupení objektů stejného typu.
- Podchycuje na obecné úrovni podstatu všech objektů podobného typu
- Třída je „šablona“ pro vytváření objektů.
- Instance
- Objekt dané třídy nazýváme někdy také instancí třídy.
- Atributy
- Každá entita modelovaného světa má vlastnosti.
- Ty vlastnosti, které jsou pro náš model podstatné, zachycujeme pomocí atributů.
- Stav objektu
- aktuální hodnoty jeho atributů.
Rysy OOP
- Abstrakce (abstraction)
- objekt pracuje jako „černá skříňka“
- objekt můžeme používat aniž bychom znali detaily jeho fungování
- implementaci objektu lze změnit, pokud nezměníme rozhraní, zbytek kódu nemusíme měnit
- Zapouzdření (encapsulation)
- objekt může přistupovat k atributům jiných objektů pouze pomocí zasílání zpráv!
- „data a funkce dohromady“
- Polymorfismus (polymorphism)
- různé objekty mohou reagovat na stejnou zprávu různě
- „když dva dělají totéž, není to totéž“
- Skládání (agregation)
- objekt může jako své součásti obsahovat jiné objekty
- Delegování (delegation)
- pro provedení operace objekt část akce řeší voláním dalších objektů
- Dědičnost (inheritance)
- pokud objekt sdílí a rozšiřuje rozhraní jiného objektu, popisujeme to dědičností
- dědičnost používáme pouze tehdy, kdy objekt přebírá (a případně rozšiřuje o nové zprávy) CELÉ rozhraní jiného objektu (jinak používáme skládání + delegování)
- potomek může zároveň kdykoli zastoupit předka
Použití konstruktů OOP v programovacích jazycích
Syntaxe Javy viz Java: Zápis tříd.
Objekty, třídy
- Každý objekt je instancí některé třídy
- Často bývá jedna třída univerzální předek (například v Javě třída
Object
), ostatní třídy jsou pak potomky této třídy nebo potomky jejích potomků.
- Vytváření objektů (instancí třídy)
- Ve většině jazyků se používá operátor
new
. - Při vytváření instance se volá konstruktor, který inicializuje hodnoty atributů.
- Konstruktor
- Konstruktor se obvykle zapisuje podobně jako metoda, ale nemá uvedené jméno, návratovým typem je třída sama.
- Třída může mít více konstruktorů.
- Pokud neuvedeme konstruktor, vytváří se obvykle tzv. „implicitní konstruktor“. Ten nastaví hodnoty proměnných na úvodní hodnoty podle jejich typu
Zprávy → metody
- Reakci objektu na zprávu popisují metody:
- Metoda má
- Přetěžování metod (overloading)
- Jedna třída může mít více metod se stejným jménem.
- Metody se stejným jménem se musí lišit počtem parametrů, typem parametrů nebo obojím.
- Překrývání metod (overlaying)
- souvisí s dědičností a polymorfismem
- potomek může na stejnou zprávu reagovat jinak, než předek
- pak říkáme, že metoda v potomkovi „překrývá“ metodu předka
- Atomizace metod
- metoda by měla řešit jednu konkrétní věc
- pro dílčí podúkoly by měla delegovat volání na další metody či jiné objekty
- délka metody bez deklarace proměnných cca 5 řádků
Atributy → proměnné
- Atributy jsou realizovány proměnnými.
- Instanční proměnné
- Každá instance má svoji vlastní hodnotu.
- Zabírají paměť tolikrát, kolik instancí třídy vytvoříme.
Například třída
UcebniSkupina
může mít atribut počet žáků
(kteří do dané skupiny chodí). Odpovídající proměnná musí být instanční, protože každá učební skupina může mít jiný počet žáků. (Je to vlastnost konkrétní skupiny.)- Třídní proměnné
- klíčové slovo
static
- Hodnota je společná pro všechny instance dané třídy.
- Zabírají paměť jen jednou, bez ohledu na počet instancí.
Je-li
maximální počet žáků
v učební skupině dán zákonem (tedy pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy UcebniSkupina
.Více o vztahu mezi instančními a třídními proměnnými viz: Platnost proměnných.
Přístupnost metod a proměnných
- Metody a proměnné mohou být přístupné:
- pouze z dané třídy
- pouze ze tříd ve stejném balíčku
- navíc z potomků třídy
- z libovolné třídy
- Přístupnost určují obvykle modifikátory (viz syntaxe v Javě v Java: Modifikátory přístupu).
Dědičnost
- V mnoha jazycích se omezuje dědičnost na dědění maximálně z jedné třídy. Tím se vyhneme některým problémům při implementaci.
Zastupitelnost tříd
- V jazycích, které vyžadují typovou kontrolu v době překladu, je často třeba předem uvést typ objektů, které budeme například vkládat do kontejneru.
- My ale často potřebujeme vkládat objekty různých tříd.
- K řešení můžeme využít:
- rozhraní
- abstraktní třídy
- dědičnost
Abstraktní třída
- Některé metody jsou abstraktní:
- nemají tělo
- uvádíme pouze hlavičku
- Těla abstraktních metod budou doplněna v potomcích třídy.
- Nelze vytvořit instanci abstraktní třídy.
- Viz Java: Abstraktní třídy, dědičnost a rozhraní.
Rozhraní (interface)
- „Čistě abstraktní třída“.
- Všechny metody jsou abstraktní.
- Třída může implementovat více rozhraní.
- Viz Java: Abstraktní třídy, dědičnost a rozhraní
Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface.
- Dědičnost × Skládání — Čítač příchodů
- Představme si, že máme již vytvořenou třídu
Kalkulacka
s metodoupricti(cislo)
. - Máme vytvořit třídu
CitacPrichodu
, která při každém průchodu dveřmi přičte do pomocné proměnné jedničku. - Napadne nás, že bychom mohli použít už fungující kód třídy
Kalkulacka
- Použijeme tedy instanci třídy
Kalkulacka
jako atribut třídyCitacPrichodu
. - Metoda
priselZakaznik()
bude delegovat volání nakalkulacka.pricti(1)
. - Dědičnost by zde nebyla vhodná, ostatní metody třídy
Kalkulacka
nemají být součástí rozhraní třídyCitacPrichodu
.
Operátory this
a super
-
this
... odkaz na objekt, jehož metodu právě provádíme. -
super
... odkaz na rodičovskou třídu (používáme typicky v konstruktoru nebo k volání překrytých metod).
Související stránky