Seminář 5
Obsah semináře
- Abstraktní třídy
- Výčtové typy (enum)
Abstraktní třídy
Ještě trochu k OOP v Javě.
Třída, kterou nelze instanciovat. Lze z ní ale dědit a potomci už instance mít mohou (pokud sami nejsou abstraktní).
Jsou situace, kdy spousta funkcionality je společná a chceme ji tedy definovat na jednom místě v nějaké nadřazené třídě, ale přesto nechceme/nemůžeme dovolit vytváření instancí přímo této nadřazené třídy. Takovou třídu označíme jako abstraktní klíčovým slovem
abstract
.Podobně se může stát, že část funkcionality jsme schopni udělat už rovnou obecně, ale část funkcionality musí konkretizovat až jednotliví potomci. Tedy chceme zajistit, aby každá instance naší třídy měla nějakou metodu, ale nevíme, jakým způsobem to pro jednotlivé podtypy instancí udělat. Jinými slovy známe hlavičku této metody, ale neznáme její implementaci. Metodu tedy přidáme jako abstraktní - přidáme klíčové slovo
abstract
a nevytvoříme ji žádné tělo (místo těla napíšeme jen středník).Pokud je ve třídě abstraktní metoda, tak i třída musí být abstraktní.
Příklad:
- Naše základní třída
Vehicle
. - Nechceme, aby se nám v systému vyskytovaly dopravní prostředky neznámého typu, ale zároveň spoustu společné funkcionality můžeme implementovat už zde.
- Třídu
Vehicle
tedy označíme za abstraktní klíčovým slovemabstract
. Tím zamezíme vytváření přímo jejich instancí - všechny instance budou instance nějakého jejího konkrétního potomka. - Podobně s
RegisteredVehicle
pro dopravní prostředky podléhající registraci u úřadů.
- Naše základní třída
A proč ne
SelfMaintanable
jako abstraktní třídu dědící zVehicle
, ze které bychom dále dědili doMotorbike
,Car
aBicycle
?
Pár argumentů:- Je to hodně obecná vlastnost, kterou zdaleka nemusí mít pouze dopravní prostředky (žehlička, sáňky, příbor, stream, instalátor, …).
- Reálně by v té třídě byly navíc pouze hlavičky metod
prepareToUse()
aisReady()
, tedy bychom pouze zaručovali existenci daného rozhraní, ale nic z něj neimplementovali. - Je možnost samostatné údržby definující vlastnost nějakého typu vozidel?
Reálně se ale programátor vždy rozhoduje sám, jestli je podle něj lepší použít abstraktní třídu nebo interface.
Abstraktní třídy (pochopitelně) nemohou být
final
.Ukázka použití je v příkladu z minula.
Enumy (výčtové typy)
- Programátorem definovaný konečně-hodnotový datový typ.
- Můžeme přidat i atributy a metody.
- Nelze vytvářet nové instance mimo vyjmenované v kódu výčtu. Tj. instance jsou právě naše prvky výčtu.
- Nelze dědit (s malou výjimkou instance jako podtypu).
- Instance mohou mít dynamický obsah.
- Statický obsah je také ok.
- Lze přes ně iterovat (statická metoda values() vrátí všechny prvky výčtu).
- Ukázka.
Úkoly
Data můžete čerpat třeba odsud.
Implementujte výčtový typ pro planety (naší) sluneční soustavy.
Ke každé planetě přidejte údaje o délce dne v sekundách a roku v dnech dané planety.
Ke každé planetě přidejte počet měsíců (vesmírných objektů, ne časových jednotek).
Ke každé planetě přidejte informaci o tom, jestli tam byl objeven život. (To se v budoucnosti může změnit.)
Za pomocí Vašeho enumu data nějak hezky vypište v mainu. (Hezký by měl být hlavně kód.;) )
(volitelné) Přidejte i chudáka Pluto.
Výsledek odevzdejte emailem s předmětem jj1-05 na tomas.urbanec@upol.cz do 7.11.2023, 14:59 CEST. Odevzdávejte pouze zdrojové kódy, nikoliv celé projekty vygenerované IDE.