17. diel - Rozhranie (interface) v Jave
V minulej lekcii, Diár s databázou v Jave - Metódy diára, výnimky a final , sme sa pozreli na metódy triedy
Diar
, krátko pozreli na výnimky a kľúčové slovo final.
Dnes to bude opäť trochu teoretické, objavíme ďalšie topí objektovo orientovaného programovania, uvedieme si totiž rozhranie.
Rozhranie
Rozhraním objektu sa myslí to, ako je objekt viditeľný zvonku. Už vieme,
že objekt obsahuje nejaké metódy, tie môžu byť privátne alebo verejné.
Rozhranie objektu tvorí práve jeho verejné metódy, je to spôsob, akým s
určitým typom objektu môžeme komunikovať. Už sme niekoľkokrát mohli
vidieť aké verejné metódy naša trieda ponúka, napr. u nášho bojovníka
do arény. Trieda Bojovnik
mala nasledujúce verejné metódy:
void utoc(Bojovnik souper)
void branSe(int uder)
boolean jeZivy()
void nastavZpravu(String zprava)
String vratPosledniZpravu()
String grafickyZivot()
utoc()
alebo branSe()
. To
stále nie je nič nové, že?
My si však rozhranie môžeme deklarovať zvlášť a to podobným spôsobom ako napríklad triedu. Toto rozhranie potom použijeme ako dátový typ.
Všetko si vyskúšame, ale na niečom jednoduchšom, než je bojovník.
Vytvorme si nový projekt a nazvime ho Rozhrani
. Pridáme si
nejakú jednoduchú triedu. Pretože by sa podľa môjho názoru mala teória
vysvetľovať na niečom odľahčujúcom, urobíme si triedu vtáka. Bude
vedieť pípať, dýchať a únavy. Pridajme si triedu Ptak
, bude
vyzerať takto:
public class Ptak { public void pipni() { System.out.println("♫ ♫ ♫"); } public void dychej() { System.out.println("Dýcham..."); } public void klovni() { System.out.println("Klov, klov!"); } }
Trieda je naozaj triviálna. Prejdime do hlavného súboru
Rozhrani.java
s metódou main()
a vytvorme si
inštanciu vtáka:
Ptak ptak = new Ptak();
Teraz napíšeme ptak.
a necháme IDE, aby nám zobrazilo
metódy na triede (možno tiež vyvolať stlačením Ctrl +
space):
- .<>
- .<>
Teraz vtákovi vytvoríme rozhranie. Využijeme na to kľúčové slovo
interface
(slovensky rozhranie). Pomenovanie rozhrania v Jave je
pomerne veda, my sa uspokojíme s názvom PtakInterface
:
-
Pravým tlačidlom klikneme na projekt, a klikneme na položku New -> Java Class. V okne, ktoré sa otvorí potom, prepneme
Class
naInterface
: -
Pravým tlačidlom klikneme na projekt a klikneme na položku New -> Java Interface:
Do rozhrania PtakInterface
teda pridáme hlavičky metód,
schválne jednu vynecháme a pridáme iba metódy na pípanie a dýchanie:
public interface PtakInterface { void pipni(); void dychej(); }
Modifikátor public
neuvádzame, pretože rozhranie obsahuje
vždy iba verejné metódy. Inak by to nemalo zmysel, rozhranie udáva, ako s
objektom zvonku pracovať.
Vráťme sa do Rozhrani.java
a zmeňme riadok s premennou
ptak
tak, aby už nebola typu Ptak
, ale
PtakInterface
:
PtakInterface ptak = new Ptak();
Kódom vyššie hovoríme, že v premennej type PtakInterface
očakávame objekt, ktorý obsahuje tie metódy, čo sú v rozhraní. IDE nám
vyhubuje, pretože trieda Ptak
zatiaľ rozhranie
PtakInterface
neobsahuje, aj keď potrebné metódy má, nevie, že
rozhranie poskytuje. Presunieme sa do triedy Ptak
a nastavíme jej,
že implementuje interface PtakInterface
. Urobíme to kľúčovým
slovom implements
:
public class Ptak implements PtakInterface { // ...
Keď sa teraz vrátime do súboru Rozhrani.java
, riadok s
premennou typu PtakInterface
je už v poriadku, trieda
Ptak
korektne implementuje rozhranie PtakInterface
a
jej inštancia môže byť do premennej tohto typu uložená.
Skúsme teraz vymazať z triedy Ptak
nejakú metódu, ktorú
rozhranie udáva, napríklad pipni()
. IDE nás upozorní, že
implementácia nie je kompletná. Vráťme ju zas späť.
Opäť pridáme riadok ptak.
do metódy main()
v
súbore Rozhrani.java
, IDE nám ponúkne nasledujúce metódy:
- .<>
- .<>
ptak
je už typu
PtakInterface
, nie Ptak
. Metóda klovni()
úplne chýba.
Na čo je to dobré? Výhod a využitie je viac, na prvé sme už prišli. Pomocou rozhrania dokážeme zjednodušiť rozhranie nejakého zložitého objektu a vystaviť len tú časť, ktorá sa nám v tom čase hodí.
Ešte dodám, že nemôžeme vytvoriť inštanciu z rozhrania, tento kód nebude fungovať:
// tento kód nebude fungovať PtakInterface ptak = new PtakInterface();
Viacnásobná dedičnosť
Java (rovnako ako väčšina jazykov) nepodporuje viacnásobnú dedičnosť. Nemôžeme teda jednu triedu oddediť z niekoľkých iných tried. Je to hlavne z toho dôvodu, že môže vyvstať problém kolízie názvov metód v rôznych triedach, z ktorých dedíme. Viacnásobná dedičnosť sa často obchádza práve cez interface, pretože tých môžeme v triede implementovať koľko chceme. Umožňuje nám to s inštanciou potom pracovať určitým spôsobom a vôbec nás nezaujíma, akého typu objekt v skutočnosti je a čo všetko navyše obsahuje.
Pridajme si k projektu rozhranie JesterInterface
. Bude to
rozhranie jaštera. Ten bude vedieť tiež dýchať a ešte sa plaziť:
public interface JesterInterface { void plazSe(); void dychej(); }
Vtákojašter
Vyskúšajme si "viacnásobnú dedičnosť", presnejšie implementáciu
viacerých rozhraní v jednej triede. Urobme si vtákoještera. Pridajme k
projektu triedu PtakoJester
. Bude implementovať rozhranie
PtakInterface
a JesterInterface
:
public class PtakoJester implements JesterInterface, PtakInterface { }
-
Keď teraz klikneme na ikonu žiarovky, môžeme v kontextovom menu zvoliť možnosť Implement methods. IntelliJ nám automaticky do triedy vygeneruje potrebné metódy:
-
Keď teraz klikneme na ikonu žiarovky, môžeme v kontextovom menu zvoliť možnosť Implement all abstract methods. NetBeans nám automaticky do triedy vygeneruje potrebné metódy:
public class PtakoJester implements JesterInterface, PtakInterface { @Override public void plazSe() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void dychej() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void pipni() { throw new UnsupportedOperationException("Not supported yet."); } }
Všimnite si, že IDE pridalo notáciu @Override
k metódam,
ktoré implementujú rozhranie. Je to tak prehľadnejšie a kľúčové slovo
@Override
si pripíšeme aj k metódam pipni()
a
dychej()
v triede Ptak
.
Metódy v triede PtakoJester
doimplementujeme:
@Override public void plazSe() { System.out.println("Plazím sa..."); } @Override public void dychej() { System.out.println("Dýcham..."); } @Override public void pipni() { System.out.println("♫ ♫♫ ♫ ♫ ♫♫"); }
Presuňme sa do Rozhrani.java
a vytvorme si inštanciu
vtákoještera:
PtakoJester ptakojester = new PtakoJester();
Uistite sa, že má metódy ako vtáka, tak aj jaštera:
- .<>
- .<>
V budúcej lekcii, Pretypovanie a hierarchia objektov v Jave , sa naučíme ďalšie pokročilé techniky objektovo orientovaného programovania.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 847x (11.7 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java