Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
|
informatika:maturita:19a [26. 04. 2015, 02.27] xzemla1 |
informatika:maturita:19a [25. 02. 2018, 22.53] (aktuální) xjasek [Dědičnost] |
||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| - | <WRAP center round tip 60%> | ||
| - | Mělo by zde být vše, jen tím rozhraním si nejsem moc jistý. | ||
| - | </WRAP> | ||
| - | |||
| - | |||
| ====== Principy objektově orientovaného programování ====== | ====== Principy objektově orientovaného programování ====== | ||
| - | ===== základní jednotky OOP: ===== | + | ===== Vztah k ostatním paradigmatům ===== |
| - | ==== Třída ==== | + | Na rozdíl od imperativního a strukturovaného programování je výkonný kód objektově orientovaného programování obsažen v rámci objektů. To znamená, že konkrétní hodnoty jsou uloženy jako atributy těchto objektů. Zpracování atributů spolu s celkovou komunikací s objekty probíhá pomocí kódu, který je obsažený v metodách objektů. Navenek pak program působí jako několik navzájem spolupracujících objektů, což umožňuje snadnější přenos kódu mezi různými projekty a jednodušší úpravu již existujícího kódu pomocí dědičnosti. Další výhodou je také větší zabezpečení dat díky viditelnosti atributů. |
| - | vzor definován uživatelem, který může obsahovat metody i proměnné (např. třída clovek, obsahující proměnné, např: | + | Nevýhodou objektově orientovaného programování je jeho větší náročnost na paměť a výpočetní rychlost, proto se používá hlavně u moderních počítačů, kde jsou tyto nevýhody téměř neznatelné. U mikropočítačů a jednoduchých jednoúčelových strojů je však výhodnější použití strukturovaného programování. |
| - | <WRAP center round box 60%> | + | |
| - | class Clovek{ | + | |
| - | string jmeno; | + | ===== Zapouzdření ===== |
| - | int vek;} | + | Zapouzdření může být chápáno jako zabalení dat a metod do jednoho objektu. Tento proces váže data s metodami, které s těmito daty pracují, čímž umožňuje základní funkce OOP. Další funkcí zapouzdření je znepřístupnění dat a metod na základě jejich viditelnosti. |
| - | </WRAP> | + | ===== Dědičnost ===== |
| - | + | ||
| - | a metody, např: | + | |
| - | <WRAP center round box 60%> | + | |
| - | dychej(){...}; | + | |
| - | rekni(string co){...}; | + | Dědičnost umožňuje tvorbu nových tříd podle již vytvořených tříd. Tyto odvozené třídy pak obsahují všechny atributy a metody rodičovských tříd. Odvozené třídy si mohou tyto data různě upravovat nebo přidávat další. |
| - | + | ||
| - | } | + | |
| - | </WRAP> | + | |
| - | + | ||
| - | ==== Objekt ==== | + | |
| - | + | ||
| - | instance třídy, vzájemně se liší svými vlastnostmi(atributy) a mají stejné metody jako třída | + | |
| - | + | ||
| - | např . | + | |
| - | <WRAP center round box 60%> | + | |
| - | clovek kaja{ | + | |
| - | + | ||
| - | jmeno = "Karel Novak"; | + | |
| - | + | ||
| - | vek = 55; | + | |
| - | } | + | |
| - | </WRAP> | + | |
| - | + | ||
| - | a můžeme použít metodu | + | |
| - | <WRAP center round box 60%> | + | |
| - | kaja.rekni("Mam hlad"); | + | |
| - | + | ||
| - | kaja.dychej(); | + | |
| - | + | ||
| - | </WRAP> | + | |
| - | + | ||
| - | můžeme si vytvořit více instancí: | + | |
| - | <WRAP center round box 60%> | + | |
| - | clovek honza{ | + | |
| - | + | ||
| - | jmeno = "Jan Cerny"; | + | |
| - | + | ||
| - | vek = 10;} | + | |
| - | </WRAP> | + | |
| - | + | ||
| - | a opět můžeme použít stejné metody... | + | |
| - | + | ||
| - | ===== Základní pilíře OOP ===== | + | |
| - | OOP stojí na třech základních pilířích: | + | |
| - | + | ||
| - | ==== Zapouzdření ==== | + | |
| - | + | ||
| - | umožňuje nám skrýt ty metody a atributy, ke kterým nechceme, aby bylo možné přistupovat z vnějšku. Např. u třídy clovek můžeme proměnnou datumNarozeni nechat na skrytou (private) a tím zabráníme, aby mohla být změněna z vnějšku. Tuto vlastnost definujeme pomocí viditelnosti, která může nabývat hodnot public, protected, private. Díky tomu můžou objekty fungovat jako tzv. černé skříňky: můžeme jim dát vstup, přičemž dostaneme nějaký výstup, ale nemusíme se vůbec zajímat o to, jak to vevnitř funguje. | + | |
| - | Na tomto principu funguje rozhraní(interface), jehož vlastnosti poté implementujeme do různých tříd. | + | |
| - | ==== Dědičnost ==== | + | |
| - | + | ||
| - | Usnadňuje vytváření podobných tříd. Z rodičovské třídy si vezme podtřída všechny metody a proměnné(resp. ty, které mají nastavenou viditelnost na public nebo protected) a může si navíc přidat svoje. | + | |
| např: | např: | ||
| <WRAP center round box 60%> | <WRAP center round box 60%> | ||
| - | class Zpevak extends Clovek {(říkáme, že třída pro zpěváky je potomkem člověka) | + | class Zpevak extends Clovek { |
| zpivej{}; | zpivej{}; | ||
| Řádek 82: | Řádek 24: | ||
| } | } | ||
| </WRAP> | </WRAP> | ||
| + | V tomto příkladu jsme vytvořili novou třídu //Zpevak//, která je odvozena od třídy //Clovek//. Objekt třídy //Zpevak// tedy může využívat všechny atributy a metody třídy //Clovek// (např. metoda //vstan()// a atribut //barvaOci//) a zároveň nově vytvořené metody //zpivej()// a //tancuj()//. | ||
| + | ==== Vícenásobná dědičnost ==== | ||
| + | Počet rodičovských tříd je určen použitým programovacím jazykem (např. Java umožňuje pouze jednu rodičovskou třídu, C++ umožňuje více). | ||
| - | ==== Polymorfismus ==== | + | |
| + | ===== Polymorfismus ===== | ||
| Umožňuje použít jednotné rozhraní pro práci s různými typy objektů | Umožňuje použít jednotné rozhraní pro práci s různými typy objektů | ||
| Řádek 94: | Řádek 40: | ||
| Pod pojmem polymorfismus můžeme také rozumět **Přetěžování metod** - to znamená že metoda může fungovat více různými způsoby, které se rozliší podle druhu a počtu parametrů. | Pod pojmem polymorfismus můžeme také rozumět **Přetěžování metod** - to znamená že metoda může fungovat více různými způsoby, které se rozliší podle druhu a počtu parametrů. | ||
| - | Např metoda //rekni(string vyrok);// umožní objektu clovek říct nějaký výrok jen tak do vzduchu, zatímco metoda //rekni(string vyrok; clovek prijemce; zpusobHlasitosti hlasitost)// umožní tomu samému objektu říct výrok konkrétnímu příjemci a zvolenou hlasitostí. | + | Např metoda //rekni(string vyrok);// umožní objektu clovek říct nějaký výrok jen tak do prázdna, zatímco metoda //rekni(string vyrok; clovek prijemce; zpusobHlasitosti hlasitost)// umožní tomu samému objektu říct výrok konkrétnímu příjemci a zvolenou hlasitostí. |
| + | V některých programovacích jazycích umožňuje polymorfismus metodám také různé zpracování parametrů různého typu. | ||
| - | ==== Vícenásobná dědičnost ==== | + | ===== Viditelnost atributů a metod ===== |
| - | Možnost potomka dědit z více tříd zároveň. Její použití se příliš neosvědčilo, kvůli riziku konfliktu jmen, konstruktorů, a dalším problémům. Lze ji využít např. v C++ | + | Nastavením viditelnosti dat můžeme určit, které části programu budou mít k těmto datům přístup. Nastavit můžeme tři základní možnosti. |
| + | * private - data jsou viditelná pouze pro konkrétní objekt | ||
| + | * public - data jsou viditelná komukoli | ||
| + | * protected - data jsou viditelná pouze pro konkrétní třídu a odvozené třídy | ||
| + | |||
| + | ===== Rozhraní ===== | ||
| + | Zjistíme, že programátor umí psát na počítači a účetní také. Intuitivně cítíme, že nebudou mít mnoho dalších společných schopností a navíc tuto dovednost může mít napříč povoláními leckdo, proto nemá smysl tvořit třídu na způsob ČlovekPracujícíSPočítačem a od ní dědit Programátora a Účetní, ale je výhodnější například vytvořit rozhraní SchopenPsátNaPočítači s požadavkem na metodu napišNaPočítači() a upravit třídy Programátor a Účetní tak, aby toto rozhraní implementovaly, tedy předepsanou metodu, a to každý po svém. V definici rozhraní nemůže být obsažen kód (implementace) dané metody, ale všechny třídy, které toto rozhraní implementují, musí být schopny se s příkazem napišNaPočítači() nějak vypořádat. | ||
| + | Obdobně může abstraktní třída předepisovat doimplementování metod, pro které ona sama nemá vlastní kód, ale jen předpis abstraktní metody. | ||