2023-02-19 23:07:03 +01:00
|
|
|
# Generické programování
|
2023-03-31 07:57:10 +02:00
|
|
|
|
2023-02-19 23:07:03 +01:00
|
|
|
- **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)
|
2023-03-31 07:57:10 +02:00
|
|
|
|
2023-06-04 13:09:10 +02:00
|
|
|
- popisuje, co nějaká třída umí: **hlavičky metod**
|
2023-02-19 23:07:03 +01:00
|
|
|
- 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
|
2023-03-31 07:57:10 +02:00
|
|
|
- název rozhraní obsahuje **velké písmenko I** na začátku
|
2023-02-19 23:07:03 +01:00
|
|
|
|
|
|
|
## Abstraktní třída
|
2023-03-31 07:57:10 +02:00
|
|
|
|
2023-02-19 23:07:03 +01:00
|
|
|
- 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
|
2023-03-31 07:57:10 +02:00
|
|
|
- třída není úplná
|
2023-02-19 23:07:03 +01:00
|
|
|
- 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
|
2023-03-31 07:57:10 +02:00
|
|
|
|
2023-02-19 23:07:03 +01:00
|
|
|
- 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)
|
2023-03-31 07:57:10 +02:00
|
|
|
- pokud předka neuvedeme, je předkem třída `Object`
|
|
|
|
- `Object` je tudíž (pra)předkem **každé** třídy
|
2023-02-19 23:07:03 +01:00
|
|
|
- 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á
|
2023-06-04 13:09:10 +02:00
|
|
|
- obráceně ne (runtime error), předek nemusí implementovat vše, co potomek
|
|
|
|
- každou referenci je možné přetypovat na `Object`
|
2023-02-21 15:37:06 +01:00
|
|
|
|
|
|
|
## Polymorfismus
|
2023-03-31 07:57:10 +02:00
|
|
|
|
2023-02-21 15:37:06 +01:00
|
|
|
- instanci potomka lze použít všude kde se očekává předek
|
|
|
|
- parametr metody
|
|
|
|
- pole předků
|
2023-06-04 13:09:10 +02:00
|
|
|
- ...
|