Cieľom štvrtého cvičenia je precvičiť si vytváranie rozhraní, definovanie finálnych typov a základné ošetrenie výnimiek. Názvy a typ premenných a metód sú zapísané v UML notácii.
Vytvorte rozhranie Zariadenie s metódami zapni(): void a vypni(): void.
public interface Zariadenie { | |
public void zapni(); | |
public void vypni(); | |
} |
Vytvorte rozhranie Termostat s metódou nastavTeplotu(teplota: int): void.
public interface Termostat extends Zariadenie { | |
public void nastavTeplotu(int teplota); | |
} |
Vytvorte abstraktnú triedu ZakladneZariadenie, ktoré implementuje rozhranie Zariadenie. Do triedy pridajte chránené premenné stav: boolean a nazov: String. Do triedy pridajte konštruktor ZakladneZariadenie(nazov: String), ktorý nastaví členskú premennú nazov. Implementujte metódy zapni(): void tak, aby ak zariadenie nie je ešte zapnuté, nastaví stav na true a vypíše správu "zariadenie zapnuté" a metódu vypni(): void tak, aby ak zariadenie nie je vypnuté nastavilo stav na false a vypíše správu "zariadenie vypnuté".
public abstract class ZakladneZariadenie implements Zariadenie { | |
protected String nazov; | |
protected boolean stav; | |
public ZakladneZariadenie(String nazov) { | |
this.nazov = nazov; | |
// premennú stav nie je potrebné inicializovať na 'false', ale je to vhodnné pre lepšiu čitateľnosť | |
this.stav = false; | |
} | |
@Override | |
public void zapni() { | |
if (! this.stav) { | |
this.stav = true; | |
System.out.println("zariadenie zapnuté"); | |
} | |
} | |
@Override | |
public void vypni() { | |
if (this.stav) { | |
this.stav = false; | |
System.out.println("zariadenie vypnuté"); | |
} | |
} | |
} |
Vytvorte triedu Osvetlenie odvodenú z triedy ZakladneZariadenie implementujúcu rozhranie Zariadenie. Pridajte konštruktor Osvetlenie(nazov: String), ktorý volá konštruktor nadradenej triedy. Predefinujte metódu zapni(): void a vypni(): void tak aby sa najprv otestovalo či už zariadenie nie je zapnuté resp. vypnuté, potom sa zavolala implementácia nadradenej triedy a nakoniec sa vypísala správa "osvetlenie zapnuté" resp. "osvetlenie vypnuté".
public class Osvetlenie extends ZakladneZariadenie implements Zariadenie { | |
public Osvetlenie(String nazov) { | |
super(nazov); | |
} | |
@Override | |
public void zapni() { | |
if (! this.stav) { | |
super.zapni(); | |
System.out.println("osvetlenie zapnuté"); | |
} | |
} | |
@Override | |
public void vypni() { | |
if (this.stav) { | |
super.vypni(); | |
System.out.println("osvetlenie vypnuté"); | |
} | |
} | |
} |
Vytvorte triedu Vykurovanie odvodené od triedy ZakladneZariadenie implementujúce rozhrania Zariadenie a Termostat. Do triedy pridajte členskú premennú teplota: int. Pridajte konštruktor Vykurovanie(nazov: String), ktorý volá konštruktor nadradenej triedy. Predefinujte metódy zapni(): void a vypni(): void tak, aby sa pri zapnutí nastavila teplota na 25 a pri vypnutí na 0. Pridajte implementáciu nastavTeplotu(teplota: int): void, ktorá nastaví teplotu a vypíše správu "aktuálna teplota: [teplota]".
public class Vykurovanie extends ZakladneZariadenie implements Zariadenie, Termostat { | |
/* | |
statické premenné uveďte v triede ako prvé, potom uveďte normálne premenné usporiadané podľa prístupu | |
najpr. 'public', 'protected' a nakoniec 'private' | |
podobne usporiadajte metódy (najprv uveďte konštruktory) | |
*/ | |
private static final int MAX_TEPLOTA = 40; | |
private int teplota; | |
public Vykurovanie(String nazov) { | |
super(nazov); | |
} | |
@Override | |
public void zapni() { | |
if (! stav) { | |
nastavTeplotu(25); | |
super.zapni(); | |
} | |
} | |
@Override | |
public void vypni() { | |
if (stav) { | |
nastavTeplotu(0); | |
super.vypni(); | |
} | |
} | |
@Override | |
public void nastavTeplotu(int teplota) { | |
if (teplota < 0 || teplota > MAX_TEPLOTA) { | |
throw new IllegalArgumentException("teplota je mimo rozsah"); | |
} | |
this.teplota = teplota; | |
System.out.println("aktuálna teplota: " + this.teplota); | |
} | |
} |
Vytvorte triedu Dom, ktorá bude mať členské premenné vykurovanie: Vykurovanie a osvetlenie: Osvetlenie. Pridajte konštruktor, ktorý nastaví členské premenné. Pridajte metódy zapniSvetlo(): void, vypniSvetlo(): void, zapniKurenie(): void, vypniKurenie(): void a nastavTeplotu(teplota: int): void, ktoré volajú zodpovedajúce metódy členských premenných.
public class Dom { | |
private Vykurovanie vykurovanie; | |
private Osvetlenie osvetlenie; | |
public Dom(Vykurovanie vykurovanie, Osvetlenie osvetlenie) { | |
this.osvetlenie = osvetlenie; | |
this.vykurovanie = vykurovanie; | |
} | |
public void zapniSvetlo() { | |
this.osvetlenie.zapni(); | |
} | |
public void vypniSvetlo() { | |
this.osvetlenie.vypni(); | |
} | |
public void zapniKurenie() { | |
this.vykurovanie.zapni(); | |
} | |
public void vypniKurenie() { | |
this.vykurovanie.vypni(); | |
} | |
public void nastavTeplotu(int teplota) { | |
this.vykurovanie.nastavTeplotu(teplota); | |
} | |
} |
Vytvorte triedu Program do ktorej pridajte metódu main. V metóde main vytvorte jeden dom, zapnite svetla, zapnite kúrenie a nastavte teplotu na 30 stupňov.
Do triedy Vykurovanie pridajte statickú finálnu premennú MAX_TEPLOTA: int, ktorú nastavte na 40 stupňov.
V triede Vykurovanie upravte metódu nastavTeplotu(teplota: int): void tak aby ak je teplota menej ako 0, alebo viac ako MAX_TEPLOTA sa vyvolá výnimka IllegalArgumentException so správou, že teplota je mimo rozsahu.
Upravte metódu main tak aby ste otestovali nastavenie teploty a ošetrili výnimku IllegalArgumentException. Pri obsluhe chyby vypíšte správu a nastavte teplotu na 25 stupňov. Pridajte aj kód, ktorý sa na konci vykoná vždy (aj keď došlo k chybe) a ktorý vypne kúrenie.
public class Program { | |
public static void main(String args[]) { | |
Dom dom = new Dom(new Vykurovanie("vykurovanie 1"), new Osvetlenie("osvetlenie 1")); | |
dom.zapniSvetlo(); | |
dom.zapniKurenie(); | |
try { | |
dom.nastavTeplotu(100); | |
} catch (IllegalArgumentException chyba) { | |
System.out.println(chyba.getMessage()); | |
dom.nastavTeplotu(25); | |
} finally { | |
dom.vypniKurenie(); | |
} | |
} | |
} |