Pro vyřešení této úlohy je třeba
Rozumět principům objektového programování v jazyce Java.
Umět pracovat s rozhraními (klíčové slovo interface).
Chápat princip dědičnosti včetně abstraktních tříd.
V této úloze bude Vaším úkolem implementovat čtyři třídy, které budou představovat různé typy hasičských aut. Hasičské auto je reprezentováno rozhraním FireTruck. Každé hasičské auto má předem danou velikost posádky. K získání velikosti posádky slouží metoda getCrew(). Auto může být dispečinkem automaticky vysíláno k různým typům událostí (požár, dopravní nehoda). Jesli je auto vysíláno automaticky k požáru, resp. k dopravní nehodě, zjistíme pomocí metod requiredForFireAccidents() a requiredForTrafficAccidents(). Chování těchto metod pro konkrétní typ auta je specifikováno v dokumentaci rozhraní. Dále je rozhraním předepsaná metoda toString() pro popis auta.
Specifickými typy hasičských aut jsou: (a) cisterna TankTruck, která veze jisté množství vody a má čerpadlo s daným výkonem, (b) záchranářské auto CrashTruck, které je speciálním případem cisterny a kromě vody veze i různé vyprošťovací vybavení reprezentované třídou RescueEquipment a (3) automobilový žebřík LadderTruck.
Nejdříve implementujte abstraktní třídu AbstractFireTruck, která bude předkem pro všechna hasičská auta a bude obsahovat jejich společné metody a atributy. Třída bude implementovat rozhraní FireTruck a bude obsahovat atribut crew reprezentující počet členů posádky. Dále bude obsahovat konstruktor s jedním parametrem, který inicializuje hodnotu atributu. Třída bude implementovat metodu getCrew() podle dokumentace rozhraní.
Dále vytvořte třídu TankTruckImpl, která bude implementovat rozhraní TankTruck a rozšiřovat abstraktní třídu. Třída bude mít konstruktor se třemi parametry typu int. První bude definovat posádku, druhý kapacitu nádrže na vodu v litrech a třetí výkon čerpadla v litrech za minutu. Naimplementujte metody předepsané rozhraním. Metoda getMinJettingPeriod() závisí na objemu vodní nádrže a výkonu čerpadla a udává dobu hašení vodou. Dále naimplementujte metodu toString(), která vrátí popis objektu ve formátu "Tank fire truck with <capacity>l of water and <output>l/min pump", kde <capacity> je hodnota atributu udávajícího kapacitu vodní nádrže a <output> je hodnota atributu udávajícího výkon čerpadla.
Analogicky vytvořte třídu CrashTruckImpl, která implementuje rozhraní CrashTruck a zaroveň rozšiřuje třídu TankTruckImpl. Třída bude mít konstruktor se čtyřmi parametry. První tři typu int budou definovat posádku, kapacitu nádrže na vodu a výkon čerpadla, čtvrtý typu RescueEquipment bude definovat záchranářské vybavení, které auto veze. Metoda toString() vrátí popis objektu ve formátu "Crash fire truck with rescue equipment: <equipment>", kde <equipment> jsou informace o záchranářském vybavení.
Analogicky vytvořte i třídu LadderTruckImpl, která implementuje rozhraní LadderTruck a rozšiřuje abstraktní třídu. Třída bude mít konstruktor se dvěma parametry typu int. První definuje posádku a druhý délku žebříku v metrech. Metoda toString() vrátí popis objektu ve formátu "Ladder fire truck with ladder length: <length>m", kde <length> je délka žebříku.
K dispozici máte čtyři testovací třídy, pro každou z Vámi vytvořených tříd jednu. Můžete tak testovat jednotlivé třídy postupně a nemusíte testování odkládat až na konec. Testovací třídy slouží jako formální zadání. To znamená, že správné řešení je takové, které úspěšně projde všemi testy.
Každé rozhraní obsahuje přesné požadavky na implementaci, proto si vždy pečlivě přečtěte všechny komentáře. Rozhraní jsou součástí zadaní, rozhodně je neměňte.
Před odevzdáním úlohy si zkontrolujte:
Zda jde úloha přeložit a zda jdou přeložit i všechny testy.
Zdali všechny testy projdou bez chyby.
Zda jste nezapomněli správně vyplnit hlavičky všech tříd ve formátu JavaDoc (popis třídy, autor, popis všech metod, apod.)
Je důležité studentům vysvětlit dekompozici této úlohy a význam všech jejích tříd. Zdůrazněte princip abstraktní třídy a proč se používá (obecně i v tomto případě). Upozorněte na paralelní hierarchii dědičnosti a vysvětlete výhody tohoto uspořádání.
Prověřte, že studenti do hlaviček tříd správně doplnili své jméno a popis třídy.
Prověřte, že studenti neporušují princip zapouzdření.