PB162: Úloha číslo 4
Doprava
Zadání úlohy
Úloha má za cíl procvičit používání rozhraní a dědičnosti.
- Stáhněte si zabalený podklad pro domácí úkol: doprava-zaklad.zip.
Najdete v něm některé třídy a rozhraní z požadované objektové hierarchie. Vaším úkolem je
dodělat ostatní třídy a program učinit funkčním. Není dovoleno jakkoliv dodané třídy měnit,
s výjimkou toho, že je z původních balíků doprava,
doprava.vozidla a doprava.sluzby
přesunete do vlastních balíků cz.muni.fi.{vas login}.doprava,
cz.muni.fi.{vas login}.doprava.vozidla a
cz.muni.fi.{vas login}.doprava.sluzby.
- Objektová hierarchie, kterou vytvoříte/doděláte, musí odpovídat následujícímu schématu.
Poznámka: Pro úplnost připomínám, že třídy Kolo a Vuz jsou bezprostředním
potomkem nejobecnější třídy Object,
proto je tato třída uvedena jako předek v hierarchii dědičnosti.
Třídy, hierarchie dědičnosti
Strom ukazuje hierarchii dědičnosti, v závorce u každé třídy jsou uvedena rozhraní, která daná
třída implementuje.
Balík doprava.vozidla
Object
|
+--Kolo (Umyvatelny)
|
+--Vuz (Opravitelny)
|
+--OsobniAuto (Osobni, MyckouUmyvatelny)
|
+--Nakladak (Nakladni, Umyvatelny)
Balík doprava.sluzby
Object
|
+--Hadice
|
+--Mycka
|
+--AutoServis
Platí, že třídy z balíku doprava.sluzby se odkazují na objekty, které dostanou
na zpracování, pouze pomocí typů rozhraní. Například AutoServis vždy pracuje pouze s
parametrem typu Opravitelny, nikoliv třeba Vuz nebo Kolo.
Ve zdrojovém archívu s kostrou úlohy (viz výše) je uvedeno několik již existujících
tříd. Obzvlašť třída Demo, která vás v podstatě přinutí naprogramovat celou
funkčnost domácího úkolu. Pro účely ladění doporučuji nejprve zakomentovat všechny
řádky její metody main(..) a postupně je odkomentovávat a doprogramovávat
chybějící funkčnost a objekty.
Pro upřesnění zde ještě uvádím několika metod, jejichž význam by nemusel být zřejmý
public void projedSe(int km);
Metoda se nachází ve třídě Kolo. Simuluje projížďku na kole v zadaném počtu kilometrů.
Simulace je realizována prostým výpisem informační hlášky na obrazovku.
Metoda zároveň zašpiní kolo - každých 50 km zvýší špinavost kola o 10%.
Metoda
ostrikejHadici(Umyvatelny co);
ve třídě
Hadice
by měla očistit jakoukoliv umyvatelnou věc. To znamená, že zavolá její metodu
umyj(...) s hodnotou špinavosti o 15% menší, než byla předtím.
Podobně metoda
umyjMyckou(MyckouUmyvatelny vuz);
ve třídě
Mycka
by měla očistit myčkou umyvatelné vozidlo. To znamená, že zavolá jeho metodu
umyj(...) s hodnotou špinavosti o polovinu menší, než byla předtím.
To znamená, že toto je JEDINÁ metoda, která hodnotu špinavosti dělí (nebo násobí)! Ostatní metody
tuto hodnotu přičítají nebo odečítají. To jen pokud by to někomu nebylo jasné.
Ale není to nijak zásadní a z výukového hlediska je zanedbatelný rozdíl,
pokud se to rozhodnete naprogramovat jako odečet 50% od aktuální hodnoty.
Důležité je pouze to, aby se hodnota špinavosti NIKDY a NIKDE nedostala mimo 0% až 100%.
Zároveň by metoda umyjMyckou(..) měla zavolat metodu navoskuj() daného automobilu.
Dále zde uvádím hlavičku konstruktorů tříd Nakladak
a OsobniAuto (aby bylo jasné, co které hodnoty znamenají):
public Nakladak(String nazev, int uzitecneZatizeni)
public OsobniAuto(String nazev, int proPocetOsob)
Všechny metody po provedení vypíší na obrazovku krátkou informaci o tom, co provedly.
Také všechny třídy by měly obsahovat metodu public String toString(),
která sestaví informaci o objektu dané třídy. Tato informace se používá
na několika místech v Demu, ale doporučuji ji používat
i v ostatních třídách vašeho programu.