Kapitola 1. Přednáška 6 - rozhraní, abstraktní třídy Obsah Objektové modelovaní v Jave - pokračovaní.....................................................................1 Rozhraní ...........................................................................................................1 Co je rozhraní.....................................................................................................2 Deklarace rozhraní ..............................................................................................2 Implementace rozhraní.........................................................................................2 Využití rozhraní..................................................................................................3 Implementace více rozhraní současně......................................................................3 Implementace více rozhraní současně - příklad .........................................................3 Rozšiřování rozhraní............................................................................................4 Rozšiřování rozhraní - příklad ...............................................................................4 Rozhraní - poznámky...........................................................................................5 Abstraktní třídy ..................................................................................................5 Abstraktní třídy (2)..............................................................................................5 Příklad rozhraní - abstraktní třída - neabstraktní třída .................................................5 Objektové modelování v Jávě - pokračování Rozhraní Implementace rozhraní třídou • Implementace více rozhraní j ednou třídou Rozšiřování rozhraní (dědičnost mezi rozhraními) Rozšiřování více rozhraní (vícenásobná dědičnost mezi rozhraními) • Abstraktní třídy (částečná implementace) Rozhraní V Jávě, na rozdíl od C++ neexistuje vícenásobná dědičnost - • to nám ušetří řadu komplikací • ale je třeba to něčím nahradit 1 Přednáška 6 - rozhraní, abstraktní třídy Pokud po třídě chceme, aby disponovala vlastnostmi z několika různých množin (skupin), můžeme ji deklarovat tak, že implementuje více rozhraní Co je rozhraní • Rozhraní je vlastně popis (specifikace) množiny vlastností, 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á - přímo sama nebo podědí) všechny vlastnosti (tj. metody), které jsou daným rozhraním předepsány. • Javové rozhraní je tedy množina hlaviček metod označená identifikátorem - názvem rozhraní, (a celých specifikací - tj. popisem, co přesně má metoda dělat - vstupy/výstupy metody, její vedlešjí efekty...) Deklarace rozhraní • Vypadá i umisťuje se do souborů podobně jako deklarace třídy • Všechny metody v rozhraní musí být publicav hlavičce se to ani nemusí uvádět. • Těla metod v deklaraci rozhraní se nepíší. (Metody v rozhraní tudíž vypadají velmi podobně jako abstraktní metody ve třídách, ale nemusím psát abstract.) Příklad deklarace rozhraní public interface Informujici { void vypisInfoO; } Implementace rozhraní Příklad public class Človek implements Informujici { public void vypisInfoO { } } 2 Přednáška 6 - rozhraní, abstraktní třídy Čteme: Třída Človek implementuje rozhraní Inf ormuj ici. 1. Třída v hlavičce uvede implements NázevRozhrani 2. Třída implementuje všechny metody předepsané rozhraním Využití rozhraní 1. Potřebujeme-li u jisté proměnné právě jen funkcionalitu popsanou určitým rozhraním, 2. tuto proměnnou můžeme pak deklarovat jako typu rozhraní - ne přímo objektu, který rozhraní implementuje. Příklad Informujici petr = new Clovek("Petr Novák", 1945); petr.vypislnfo(); // "petr" stači deklarovat jen jako Informujici // jiné metody než předepsané timto intf. // nepotřebujeme! Implementace více rozhraní současně Třída sice smí dědit maximálně z jedné nadtřídy (předka), ale • zato může současně implementovat libovolný počet rozhraní! • Podmínkou ovšem je, aby se metody ze všech implementovaných rozhraní „snesly" v jedné třídě. • Které že se nesnesou? Např. dvě metody se skoro stejnou hlavičkou, lišící se ,jen" návratovým typem... Implementace více rozhraní současně - příklad Příklad - kromě výše uvedeného intf. Inf ormu j ici mějme ještě: public interface Kricici { void zakrič(); } Třída Človek implementuje dvě rozhraní: public class Človek implements Informujici, Kricici { 3 Přednáška 6 - rozhraní, abstraktní třídy public void vypisInfoO { } public void zakrič() { } } Rozšiřování rozhraní Podobně jako u tříd, i rozhraní mohou být rozšiřována/specializována. Mohou dědit. Na rozdíl od třídy, která dědí maximálně z jedné nadťřídy (předka) - z rozhraní můžeme odvozovat potomky (podrozhraní - subinterfaces) dokonce i vícenásobně - z více rozhraní odvodíme společného potomka slučujícího a rozšiřujícího vlastnosti všech předků. Přesto to nepřináší problémy jako u klasické plné vícenásobné dědičnosti např. v C++, protože rozhraní samo nemá proměnné • metody neimplementuje • nedochází tedy k nejednoznačnostem a konfliktům při podědění neprázdných, implementovaných metod a proměnných Rozšiřování rozhraní - příklad Příklad - Informuj ici informuje ,jen trochu", Dobreinformujici je schopen ke standardním informacím (vypislnf o) přidat dodatečné informace (vypisDodatecnelnf o). public interface Informujici { void vypisInfoO; } public interface Dobreinformujici extends Informujici { void vypisDodatecnelnfo() ; } Třída, která chce implementovat intf.Dobrelnf ormu j ici, musí implementovatoÄemetody předepsané tímto rozhraním. Např.: 4 Přednáška 6 - rozhraní, abstraktní třídy public class Informator implements Dobrelnformujici { public void vypisInfoO { ... // kód metody } public void vypisDodatecnelnfo() { ... // kód metody } } Rozhraní - poznámky • Používají se i prázdná rozhraní - nepředepisující žádnou metodu • deklarace, že třída implementuje také rozhraní, ji "k ničemu nezavazuje", ale poskytuje typovou informaci o dané třídě i v Java Core API j sou taková rozhraní - např. java. lang. Cloneable Abstraktní třídy I když Java disponuje rozhraními, někdy je vhodné určitou specifikaci implementovat pouzečástečně: Rozhraní = Specifikace • Abstraktní třída = Částečná implementace • Třída = Implementace Abstraktní třídy (2) Abstraktní třída je tak označena v hlavičce, např.: public abstract class AbstraktniChovatel ... Obvykle má alespoň jednu abstraktní metodu, deklarovanou např.: public abstract void vypisInfo() ... Od a.t. nelze vytvořit instanci, nelze napsat např.: Chovatel ch = new AbstraktniChovatel(...); Příklad rozhraní - abstraktní třída - neabstraktní třída Viz Svět chovatelství [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/svet.html] z učebnice: 5 Přednáška 6 - rozhraní, abstraktní třídy rozhraní svet. chovatelství. Chovatel - specifikace, co má chovatel umět svet. chovatelství.AbstraktniChovatel - částečná implementace chovatele svet. chovatelství. psi . ChovatelPsu - úplná implementace chovatele psů Pozn.: Obecný chovatel se ihned úplně implementovat nedá (ještě to neumíme), proto je definován jako abstraktní třída AbstraktniChovatel ateprve až ChovatelPsuje neabstraktní třída. 6