Úprava 2. přednášky z PPA2
This commit is contained in:
parent
f159f4e022
commit
407224e419
1 changed files with 17 additions and 8 deletions
|
@ -1,4 +1,5 @@
|
||||||
# Generické programování
|
# Generické programování
|
||||||
|
|
||||||
- **generické** = obecné, společné
|
- **generické** = obecné, společné
|
||||||
- snaha podchytit společné vlastnosti různých algoritmů/datových struktur
|
- snaha podchytit společné vlastnosti různých algoritmů/datových struktur
|
||||||
- antonymum - specifické
|
- antonymum - specifické
|
||||||
|
@ -7,6 +8,7 @@
|
||||||
- **umožnit sdílení** generického kódu
|
- **umožnit sdílení** generického kódu
|
||||||
|
|
||||||
## Rozhraní (interface)
|
## Rozhraní (interface)
|
||||||
|
|
||||||
- popisuje, co nějaká třída umí: hlavičky metod
|
- popisuje, co nějaká třída umí: hlavičky metod
|
||||||
- neříká nic o tom, jak jsou metody implementovány
|
- neříká nic o tom, jak jsou metody implementovány
|
||||||
- různé třídy mohou implementovat stejné rozhraní
|
- různé třídy mohou implementovat stejné rozhraní
|
||||||
|
@ -14,55 +16,62 @@
|
||||||
- **klientský kód** pracuje s rozhraním, jako by to byla třída
|
- **klientský kód** pracuje s rozhraním, jako by to byla třída
|
||||||
- volá metody definované v rozhraní
|
- volá metody definované v rozhraní
|
||||||
- název rozhraní se může objevit všude tam, kde se očekává název třídy
|
- název rozhraní se může objevit všude tam, kde se očekává název třídy
|
||||||
- název rozhraní => **velké písmenko I** na začátku
|
- název rozhraní obsahuje **velké písmenko I** na začátku
|
||||||
|
|
||||||
## Abstraktní třída
|
## Abstraktní třída
|
||||||
|
|
||||||
- chová se podobně jako rozhraní
|
- chová se podobně jako rozhraní
|
||||||
- říká co musí být implementováno (hlavičky metod)
|
- říká co musí být implementováno (hlavičky metod)
|
||||||
- **může obsahovat** i **implementaci některých metod**
|
- **může obsahovat** i **implementaci některých metod**
|
||||||
- nelze vytvořit instanci
|
- nelze vytvořit instanci
|
||||||
- => třída není úplná
|
- třída není úplná
|
||||||
- ostatní třídy pak mohou od abstraktní třídy "**dědit**"
|
- ostatní třídy pak mohou od abstraktní třídy "**dědit**"
|
||||||
- **musí poskytnout implementaci chybějících metod** (jako u rozhraní)
|
- **musí poskytnout implementaci chybějících metod** (jako u rozhraní)
|
||||||
- atributy abstraktní třídy se stanou součástí odděděné třídy
|
- atributy abstraktní třídy se stanou součástí odděděné třídy
|
||||||
- **metody implementované v abstraktní třídě se stanou součástí odděděné třídy**
|
- **metody implementované v abstraktní třídě se stanou součástí odděděné třídy**
|
||||||
|
|
||||||
## Dědičnost
|
## Dědičnost
|
||||||
|
|
||||||
- dědit lze i od třídy, která není abstraktní
|
- dědit lze i od třídy, která není abstraktní
|
||||||
- je možné dodat další funkcionalitu
|
- je možné dodat další funkcionalitu
|
||||||
- je možné upravit existující funkcionalitu (tzv. **přepsání** metody)
|
- je možné upravit existující funkcionalitu (tzv. **přepsání** metody)
|
||||||
- pokud předka neuvedeme, je předkem třída ```object```
|
- pokud předka neuvedeme, je předkem třída `Object`
|
||||||
- ```object```je tudíž (pra)předkem **každé** třídy
|
- `Object` je tudíž (pra)předkem **každé** třídy
|
||||||
- dědí se některé metody (uvidíme časem jaké a proč)
|
- dědí se některé metody (uvidíme časem jaké a proč)
|
||||||
- dědit lze vždy jen od **jednoho** předka
|
- dědit lze vždy jen od **jednoho** předka
|
||||||
- referenci na potomka je možné kdykoli přetypovat na referenci na předka
|
- referenci na potomka je možné kdykoli přetypovat na referenci na předka
|
||||||
- přetypovává se **reference**, nikoli instance samotná
|
- přetypovává se **reference**, nikoli instance samotná
|
||||||
- obráceně ne (runtime error) => předek nemusí implementovat vše co potomek
|
- obráceně ne (runtime error) => předek nemusí implementovat vše co potomek
|
||||||
- každou referenci je možné přetypovat na referenci na ```Object```
|
- každou referenci je možné přetypovat na referenci na `Object`
|
||||||
|
|
||||||
## Polymorfismus
|
## Polymorfismus
|
||||||
|
|
||||||
- instanci potomka lze použít všude kde se očekává předek
|
- instanci potomka lze použít všude kde se očekává předek
|
||||||
- parametr metody
|
- parametr metody
|
||||||
- pole předků
|
- pole předků
|
||||||
- ...
|
- ...
|
||||||
|
|
||||||
# Rekurzivní programy
|
# Rekurzivní programy
|
||||||
|
|
||||||
- programy, které volají sami sebe
|
- programy, které volají sami sebe
|
||||||
- rekurze, musí někdy skončit!
|
- rekurze, musí někdy skončit!
|
||||||
|
|
||||||
## Přímá rekurze
|
## Přímá rekurze
|
||||||
|
|
||||||
- metoda volá přímo sebe sama
|
- metoda volá přímo sebe sama
|
||||||
- je vidět na první pohled
|
- je vidět na první pohled
|
||||||
|
|
||||||
## Nepřímá rekurze
|
## Nepřímá rekurze
|
||||||
- ```a``` volá ```b```, ```b``` volá ```a```
|
|
||||||
|
- `a` volá `b`, `b` volá `a`
|
||||||
|
|
||||||
## Problémy rekurze
|
## Problémy rekurze
|
||||||
|
|
||||||
- problémy s hloubkou zásobníku
|
- problémy s hloubkou zásobníku
|
||||||
- spíše programátorská chyba => přetečení zásobníku
|
- spíše programátorská chyba - **přetečení zásobníku**
|
||||||
- pro mnoho praktických problémů je rekurze dostatečná
|
- pro mnoho praktických problémů je rekurze dostatečná
|
||||||
- Java umožňuje nastavit velikost zásobníku
|
- Java umožňuje nastavit velikost zásobníku
|
||||||
- často lze zapsat do nerekurzní formy
|
- často lze zapsat do nerekurzní formy
|
||||||
- nerekurzivní => často rychlejší
|
- nerekurzivní zápis je **často rychlejší**
|
||||||
- zrychlení se projeví, pokud je samotný vykonávaný kód triviální
|
- zrychlení se projeví, pokud je samotný vykonávaný kód triviální
|
||||||
- někdy je přepsání poměrně složité
|
- někdy je přepsání poměrně složité
|
Loading…
Reference in a new issue