Úprava 2. přednášky z PPA2

This commit is contained in:
Filip Znachor 2023-03-31 07:57:10 +02:00
parent f159f4e022
commit 407224e419

View file

@ -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é