Toto je starší verze dokumentu!
36 - Objektová orientace
rozšiřuje modulární jazyky jazyky o možnost spojit konkrétní data s operacemi
využívá dekompozici do modulů - tvoří samostatné celky, které tvoří objektově orientovaný systém
hlavní 3 výhody objektové orientace:
analogie mezi softwarovým modelem a reálným modelem
flexibilita takovýchto softwarových modelů
jejich znovupoužitelnost
OO jazyky: Simula 67, Smalltalk 72 a 80, C++, Java, C#,
PHP, Python, Lisp, …
čistě objektové jazyky - Smalltalk, Ruby, Python
hybridni jazyky - objektově orientované - založeny na imperativním progragramování, částečně implementují vlastnosti objektového programování - C++, Java
objektové rozšíření původně neobjektových jazyků - Object Pascal
Základní pojmy
na těchto pojmech/metodách je objektově orientované programování založeno
Objekt, Abstrakce, Polymorfismus, Dědičnost
Objekt
Abstrakce
schopnost programu zjednodušit některé aspekty informací / vlastnosti objektů, se kterými program pracuje
černá skříňka - pracujeme s ní pomocí definovaného rozhraní, ale už nás nezajímá, jak byla vytvořena a co je v ní
variant/invariant - část programu, kde se hodnoty proměnných mění/nemění při opakovaném průchodu této časti kódu
Modifikátory viditelnosti
mechanismus, kterým se dá docílit definování, které metody a proměnné budou komu přístupné
tímto mechanismem podrobněji konfigurujeme koncept zapouzdření
podle jazyka UML známe tři základní modifikátory
soukromý (private
) - přístupné pouze z metod stejné třídy
chráněný (protected
) - přístupné pouze ze stejné třídy + tříd odděděných
veřejný (public
) - dostupné všude
existují i další internal, friend, …
Polymorfismus
mnohotvárnost
reakce na stejnou zprávu se liší v závislosti na objektu, kterému byla zaslána
využívá se u rozhraní (Interface), kde více tříd implementuje jedno rozhraní
například mějme Interface Tvar
, který deklaruje metodu vypocitejObsah()
⇒ dále si pak vytvoříme jednotlivé tvary - Ctverec
a Obdelnik
, ktere budou implementovat nase rozhrani Tvar
⇒ tedy musi definovat vsechny metody, ktere nase rozhrani obsahuje ⇒ v nasem pripade metodu vypocitejObsah()
, ktera se bude list v zavislosti na zvolenem tvaru
Přetěžování metod
například nase třída Obdelnik
by mohla mít hned několik konstruktorů:
> public Obdelnik() - vytvoří defaultní obdélník například o velikosti stran a=4, b=5 jednotek
> public Obdelnik(int a, int b) - vytvoří obdélník o zadaných velikostech
> public Obdelnik(Point bod) - vytvoří obdélník o velikostech definových v jiné třídě
Přetěžování operátorů
například operátor + může sečíst dvě čísla, může konkatenovat dva řetězce, může sečíst jednotlivé položky dvou asociativních polí
Dědičnost
způsob, jak implementovat sdílené chování
v případech, kdy chceme rozšířit nějakou třídu o dané vlastnosti
jako příklad jde uvést třída Hráč, která má vlastnosti, jméno, příjmení, věk ⇒ existují ovšem různé typy hráčů, jako je útočník, obránce, brankář ⇒ u každého si budeme ovšem chtít pamatovat jiné vlastnosti (střelené góly vs. zákroky) ⇒ proto vytvoříme dané třídy rozšířením základní třídy hráč ⇒ třídy budou sdílet pouze atributy z rozšiřované třídy
Rozhraní
schéma, které deklaruje seznam metod (jména, parametry, návratové typy)
použití rozhraní na jistou třídu pak vynucuje implementaci všech metod uvedených v rozhraní ⇒ rozhraní nám může vynutit, co je třeba naimplementovat
každé třídě uvést několik rozhraní
Potvrzení
36 |
Celé jméno | OK | !!! |
Jirka Hynek |  | |
vagy |  | |
Tom Ofeig |  | |
| 3 | |
Diskuze
Dodělána kapitola Překladače na přání Honzy.
Btw… k tomu přetěžování operátorů, jak jsme se dohadovali na srazu:
Přetěžování operátorů v Javě není.
Operátor == porovnává, jestli dvě reference jsou na stejný objekt.
Výsledek: Nejsou stejne
Nemá to nic společného s equals(), které slouží k porovnávání obsahu. Přetěžuje se v případě, že si vytvoříme vlastní objekt s vlastními pravidly porovnávání.
Výsledek: Jsou stejne … protože to porovnává obsah … pokud bych si vytvořil vlastni String, mohl bych si nadefinovat vlastní equals, že bych třeba řekl, že ahoj je stejný s reverzním joha, kdybych ale použil opět == , porovnávalo by to opět reference…
Dobry priklad. Tezko uverit, ze jsme to probirali vic jak pred mesicem
Chybí návrhové vzory: singleton, abstraktní továrna, iterátor, dekorátor
„rodicovsky slot=ukazatele na objekt, z kterých byly vytvořeny“
Odkial berete tuti hovadinu nechapem sak sa pozrite na tu ukazku so selfu…