První polovina poznámek k 2. přednášce z PPA2

This commit is contained in:
Vojtěch Pour 2023-02-19 23:07:03 +01:00
parent a1316bcd77
commit 2c36ee3091

41
KIV PPA2/02_prednaska.md Normal file
View file

@ -0,0 +1,41 @@
# Generické programování
- **generické** = obecné, společné
- snaha podchytit společné vlastnosti různých algoritmů/datových struktur
- antonymum - specifické
- cíle:
- **umožnit záměnu** různých generických implementací splňující nějaká generická kritéria
- **umožnit sdílení** generického kódu
## Rozhraní (interface)
- popisuje, co nějaká třída umí: hlavičky metod
- neříká nic o tom, jak jsou metody implementovány
- různé třídy mohou implementovat stejné rozhraní
- jedna třída může implementovat více rozhraní
- **klientský kód** pracuje s rozhraním, jako by to byla třída
- 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í => **velké písmenko I** na začátku
## Abstraktní třída
- chová se podobně jako rozhraní
- říká co musí být implementováno (hlavičky metod)
- **může obsahovat** i **implementaci některých metod**
- nelze vytvořit instanci
- => třída není úplná
- ostatní třídy pak mohou od abstraktní třídy "**dědit**"
- **musí poskytnout implementaci chybějících metod** (jako u rozhraní)
- 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**
## Dědičnost
- dědit lze i od třídy, která není abstraktní
- je možné dodat další funkcionalitu
- je možné upravit existující funkcionalitu (tzv. **přepsání** metody)
- pokud předka neuvedeme, je předkem třída ```object```
- ```object```je tudíž (pra)předkem **každé** třídy
- dědí se některé metody (uvidíme časem jaké a proč)
- dědit lze vždy jen od **jednoho** předka
- referenci na potomka je možné kdykoli přetypovat na referenci na předka
- přetypovává se **reference**, nikoli instance samotná
- 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```