Co je rozhraní
-
Rozhraní je vlastně popis (specifikace) množiny vlastností tříd objektů, aniž bychom tyto vlastnosti ihned implementovali.
-
Vlastnostmi zde rozumíme především metody.
-
Říkáme, že určitá třída implementuje rozhraní, pokud implementuje (tedy má) všechny vlastnosti (tj. metody), které jsou daným rozhraním předepsány.
-
Javové rozhraní je tedy pojmenovaná množina hlaviček metod a celých specifikací, tj. popisem, co přesně má metoda dělat — vstupy/výstupy metody, její vedlejší efekty…)
Deklarace rozhraní
-
Vypadá i umisťuje se do souborů podobně jako deklarace třídy.
-
Všechny metody v rozhraní přebírají viditelnost z celého rozhraní,
-
Typicky jsou
public
stejně jako rozhraní. -
V hlavičce metod se to ani nemusí uvádět.
-
Těla metod v deklaraci rozhraní se nepíší vůbec, ani prázdné závorky.
- Příklad rozhraní
-
// Informing je něco, co o sobě umí vypsat informace public interface Informing { // Touto metodou je vypíše void writeInfo(); }
Implementace rozhraní
- Příklad implementace rozhraní
-
public interface Informing { void writeInfo(); } public class Person implements Informing { public void writeInfo() { ... // skutečný kód metody } }
Čteme: "Třída Person
implementuje rozhraní Informing
".
Kdy třída implementuje rozhraní
Třída implementuje rozhraní, jestliže:
-
Třída v hlavičce uvede
implements NázevRozhraní
-
Třída implementuje všechny metody předepsané rozhraním.
Využití rozhraní
-
Potřebujeme-li u jisté proměnné právě jen funkcionalitu popsanou určitým rozhraním,
-
tuto proměnnou můžeme pak deklarovat jako typu rozhraní a ne přímo třídy, která rozhraní implementuje.
Příklad:
// "petr" stačí deklarovat jen jako Informing, Informing petr = new Person("Petr Novák", 1945); // jelikož jiné metody než předepsané tímto intf. nepotřebujeme petr.writeInfo(); // nechtějme víc, než musíme
Dvě třídy implementující totéž rozhraní
-
Totéž rozhraní může být implementováno více třídami, často konceptuálně zcela nesouvisejícími.
-
Rozhraní
Going
("jdoucí") implementují tři třídy:-
Car
(auto má schopnost "jít", tedy jet) -
Clock
(hodiny také "jdou") -
Person
(člověk také může chodit)
-
Viz příklad mezi demo-programy v ISu: car_clock
.
Implementace více rozhraní
-
Jedna třída může implementovat více rozhraní současně.
-
To je účelné. V Javě totiž, na rozdíl od C++ neexistuje vícenásobná dědičnost, třída má tedy nejvýše jednoho předka (kromě třídy
Object
má právě jednoho). -
Implementace více rozhraní je současně praktičtější a ušetří řadu komplikací (dědění dvěma/více cestami).
-
Využije se tam, kde po třídě chceme, aby disponovala vlastnostmi z několika často nesouvisejících různých množin, můžeme ji deklarovat tak, že implementuje více rozhraní.
Podmínky
-
Podmínkou ovšem je, aby se metody ze všech implementovaných rozhraní "snesly" v jedné třídě.
-
Nesnesou se v tomto smyslu např. dvě metody se skoro stejnou hlavičkou, lišící se jen návratovým typem
Příklad
Kromě výše uvedeného intf. Informing mějme ještě:
public interface Screaming { void scream(); }
Třída Person implementuje dvě rozhraní:
public class Person implements Informing, Screaming { ... public void writeInfo() { ... } public void scream() { ... } }