Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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()
Pokiaľ si do nejakej premennej uložíme inštanciu bojovníka, môžeme na ňu volať metódy ako 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):

  • .<> Metódy vtáka - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
  • .<> Metódy vtáka - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
Vidíme, čo na vtákovi môžeme všetko volať. Sú tam samozrejme tie 3 metódy, čo sme v triede implementovali (plus ďalšie, ktoré majú objekty v základe).

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 na Interface:

    Nový interface v IntelliJ pre Javu - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
  • Pravým tlačidlom klikneme na projekt, a klikneme na položku New -> Java Interface:

    Nový interface v NetBeans pre Javu - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
K projektu sa nám pridá prázdny interface. Do neho pridáme hlavičky metód, ktoré má dané rozhranie obsahovať. Samotnú implementáciu (kód metód) sa uvádza až v triede, ktorá bude toto rozhranie implementovať. Rozhranie vytvára iba predpis metód, čo musí trieda implementovať.

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:

  • .<> Metódy vtáka s rozhraním PtakInterface - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
  • .<> Metódy vtáka s rozhraním PtakInterface - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
Vidíme, že na inštanciu môžeme teraz volať iba metódy, ktoré poskytuje rozhranie. To preto, že premenná 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:

    Automatická implementácia rozhrania v IntelliJ - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
  • 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:

    Automatická implementácia rozhrania v NetBeans - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
Po implementácii oboch rozhraní môže vyzerať kód triedy takto (závisí na použitom IDE):

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:

  • .<> Metódy vtáka a jaštera - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave
  • .<> Metódy vtáka a jaštera - Objektovo orientované programovanie v Jave - Objektovo orientované programovanie v Jave

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é 821x (11.7 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Diár s databázou v Jave - Metódy diára, výnimky a final
Všetky články v sekcii
Objektovo orientované programovanie v Jave
Preskočiť článok
(neodporúčame)
Pretypovanie a hierarchia objektov v Jave
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity