Objektově orientované programování
Z MiS
(Rozdíly mezi verzemi)
(Vytvoření stránky) |
(→Realizace konstruktů OOP v Javě: Kompletně přepsáno) |
||
Řádka 59: | Řádka 59: | ||
**jinak používáme skládání + delegování | **jinak používáme skládání + delegování | ||
− | == | + | == Zápis konstruktů OOP v Javě == |
− | * Každý objekt je instancí některé třídy | + | === Objekty, třídy === |
− | * | + | *Každý objekt je instancí některé třídy |
− | ; | + | *univerzální předek je třída Object |
− | * | + | **ostatní třídy jsou jejími potomky |
− | *parametry | + | ; Vytváření objektů |
− | *návratový typ ( | + | *operátor new |
− | + | *konstruktor | |
− | * | + | **implicitní konstruktor |
− | * | + | === Zprávy === |
− | + | * Reakci objektu na zprávu popisují metody: | |
− | **metoda by měla řešit jednu konkrétní věc | + | ; Metoda má: |
− | + | * název | |
− | + | * parametry (mají typ a název) | |
− | *Instanční | + | * návratový typ (používá se klíčové slovo <code>return</code>) |
− | * | + | ; 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) |
− | **Abstraktní třída | + | *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 === | ||
+ | *Atributy jsou realizovány proměnnými. | ||
+ | ; Instanční proměnné | ||
+ | *Každá instance má svoji vlastní hodnotu. | ||
+ | *: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.) | ||
+ | *Zabírají paměť tolikrát, kolik instancí třídy vytvoříme. | ||
+ | ; Třídní proměnné | ||
+ | * klíčové slovo <code>static</code> | ||
+ | *Hodnota je společná pro všechny instance dané třídy. | ||
+ | *:Například je-li maximální počet žáků v učební skupině dán zákonem (pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy UcebniSkupina. | ||
+ | *Zabírají paměť jen jednou, bez ohledu na počet instancí. | ||
+ | ; Přístupnost metod a atributů (určena modifikátory) | ||
+ | *<code>private</code> | ||
+ | **přístupnost pouze ze tříd v jednom balíčku | ||
+ | **implicitní volba (zvoleno automaticky, když neuvedeme) | ||
+ | *<code>protected</code> | ||
+ | **přístupnost navíc ze tříd, které jsou potomky třídy, kde je použito | ||
+ | *<code>public</code> | ||
+ | **přístupnost z libovolné třídy | ||
+ | === Dědičnost === | ||
+ | *Klíčové slovo <code>extends</code>. | ||
+ | *Třída může mít pouze jednu rodičovskou třídu! | ||
+ | === Abstraktní třída === | ||
+ | *Klíčové slovo <code>abstract</code> | ||
+ | *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. | ||
+ | === Rozhraní (interface) === | ||
+ | *„Čistě abstraktní třída“. | ||
+ | *Všechny metody jsou abstraktní. | ||
+ | *Klíčové slovo <code>implements</code>. | ||
+ | *Třída může implementovat více rozhraní. | ||
+ | <div class="Poznamka"> | ||
+ | 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. | ||
+ | </div> | ||
+ | === 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). |
Verze z 23. 5. 2012, 23:38
Obsah |
Co je to OOP?
- Objektově orientované programování (z anglického 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.
- Rozložení úlohy na dílčí součásti.
- Přiblížení struktury řešení reálnému světu.
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ávy, rozhraní
- pokud chce objekt komunikovat s jiným objektem, použije zprávu
- rozhraní objektu
- Množina zpráv, na kterou umí daný objekt reagovat.
- třída a instance
- 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ů.
- Objekt je tedy 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 vlastnostem 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á CELÉ rozhraní jiného objektu
- jinak používáme skládání + delegování
Zápis konstruktů OOP v Javě
Objekty, třídy
- Každý objekt je instancí některé třídy
- univerzální předek je třída Object
- ostatní třídy jsou jejími potomky
- Vytváření objektů
- operátor new
- konstruktor
- implicitní konstruktor
Zprávy
- Reakci objektu na zprávu popisují metody:
- Metoda má
- název
- parametry (mají typ a název)
- návratový typ (používá se klíčové slovo
return
)
- 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
- Atributy jsou realizovány proměnnými.
- Instanční proměnné
- Každá instance má svoji vlastní hodnotu.
- 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.)
- Zabírají paměť tolikrát, kolik instancí třídy vytvoříme.
- Třídní proměnné
- klíčové slovo
static
- Hodnota je společná pro všechny instance dané třídy.
- Například je-li maximální počet žáků v učební skupině dán zákonem (pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy UcebniSkupina.
- Zabírají paměť jen jednou, bez ohledu na počet instancí.
- Přístupnost metod a atributů (určena modifikátory)
private
- přístupnost pouze ze tříd v jednom balíčku
- implicitní volba (zvoleno automaticky, když neuvedeme)
protected
- přístupnost navíc ze tříd, které jsou potomky třídy, kde je použito
public
- přístupnost z libovolné třídy
Dědičnost
- Klíčové slovo
extends
. - Třída může mít pouze jednu rodičovskou třídu!
Abstraktní třída
- Klíčové slovo
abstract
- 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.
Rozhraní (interface)
- „Čistě abstraktní třída“.
- Všechny metody jsou abstraktní.
- Klíčové slovo
implements
. - Třída může implementovat více 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.
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).
Příklady použití rysů OOP v knihovnách Javy
- Polymorfismus
- Component.paint()
- v C++ by musela být virtual
- Skládání
- Čítač příchodů
- Kalkulačka jako součást