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:
Trieda je naozaj triviálna.
Prejdime do hlavného súboru Rozhrani.java
s metódou
main()
a vytvorme si inštanciu vtáka:
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:
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
:
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
:
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ť:
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ť:
Vtákoješ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
:
-
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:
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:
Presuňme sa do
Rozhrani.java
a vytvorme si inštanciu vtákoještera:
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é 831x (11.7 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java