Pokročilejší objektový návrh, dědičnost rozhraní, implementace více rozhraní. Abstraktní třídy. Obsah Implementace více rozhraní současně..............................................................................1 Implementace více rozhraní současně......................................................................................1 Implementace více rozhraní současně - příklad .........................................................................2 Rozšiřování rozhraní....................................................................................................2 Rozšiřování rozhraní............................................................................................................2 Rozšiřování rozhraní - příklad ...............................................................................................3 Rozhraní - poznámky...........................................................................................................3 Abstraktní třídy ..........................................................................................................3 Abstraktní třídy ..................................................................................................................4 Abstraktní třídy (2)..............................................................................................................4 Příklad rozhraní - abstraktní třída - neabstraktní třída .................................................................4 Reálný příklad použití abstraktní třídy.............................................................................5 Rozhraní - abstraktní třída - neabstraktní třída...........................................................................5 Searcher............................................................................................................................5 AbstractSearcher.................................................................................................................5 LinearSearcher ...................................................................................................................6 Objektové modelování v Jávě - pokračování • 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) Implementace více rozhraní současně Implementace více rozhraní současně Třída sice smí dědit maximálně z jedné nadtřídy (předka), ale 1 Pokročilejší objektový návrh, dědičnost rozhraní, implementace více roz- • 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. Informující mějme ještě: public interface Screaming { void scream(); } Třída Človek implementuje dvě rozhraní: public class Person implements Informing, Screaming { public void writelnfo() { } public void scream() { } } Rozšiřování rozhraní 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é nadtří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é 2 hraní. Abstraktní třídy. • 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í - pnklad Příklad - Informing informuje ,jen trochu", Welllnforming je schopen ke standardním informacím (wri-telnfo) přidat dodatečné informace (writeAdditionallnfo). public interface Informing { void writelnfo(); } public interface Welllnforming extends Informing { void writeAdditionallnfo(); } Třída, která chce implementovat intf.Dobrelnformujici, musí implementovatoÄemetody předepsané tímto rozhraním. Např.: public class Informator implements Welllnforming { public void writelnfo() { ... // kód metody } public void writeAdditionallnfo() { ... // 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 jsou taková rozhraní - např. java. lang. CloneableWlKIPFHlA ľi r priT r ik i. l-iinb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java.lang.Cloneable] Abstraktní třídy 3 Pokročilejší objektový návrh, dědičnost rozhraní, implementace více roz- 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, typicky předek konkrétních tříd, plných implementa- cí Třída Implementace Abstraktní třídy (2) Abstraktní třída je tak označena v hlavičce, např.: public abstract class AbstraktniChovatel . . .WIKIPFFHA TTir Tn-i- Fík ■■ L^b-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public abstract class AbstraktniChovatel ...] Obvykle má alespoň jednu abstraktní metodu, deklarovanou např.: public abstract void vypislnf o () ; WlKIPFTllA Tri r priT r ik i. L-aanL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=public abstract void vypisln-fo();] Od abstraktní třídy nelze vytvořit instanci, nelze napsat např.: Chovatel ch = new AbstraktniChovatel ( . . . ) ;WlTi:iPFillA íi r pnT riL i. l-aanb ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Chovatel ch = new AbstraktniChovatel...);] Příklad rozhraní - abstraktní třída - neabstraktní třída Viz Svět chovatelství [http://wwwfi.muni.cz/~tomp/java/ucebnice/javasrc/svet.html] z učebnice: rozhraní svet. chovatelství. ChovatelWlKlPFfllA Dip kni- Fib u Lav^ki [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=svet.chovatelstvi. Chovatel] - specifikace, co má chovatel umět • svet.chovatelství.AbstraktniChovate Hir F'n-i- Fil i. L-aa-iL ■ [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=svet.chovatelstvi. Abstrakta iChovatel] - částečná implementace chovatele • svet.chovatelství.psi. ChovatelPsuWlKlPFDlA Tlip Fn-i- Fil i. L-aa-iL i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=svet.chovatelstvi.psi. Chova 4 hraní. Abstraktní třídy. telPsu] - ú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 a teprve až ChovatelPsu je neabstraktní třída. Reálný příklad použití abstraktní třídy Rozhraní - abstraktní třída - neabstraktní třída Viz demo [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=searching] proBlueJ searchingWlKIPFTJlA ílir tni" Fík i. L n n L i Rozhraní - specifikuje, co má prohledavač umět Abstraktní třída - předek konkrétních plných implementací prohledavače Konkrétní třída - plná implementace prohledavače SearcherWlICiPFTJlA Tri r put ml i. L-a ai L i [http://cs.wikipedia.Org/wiki/Speci%C3%A11n%C3%AD:Search? search=Searcher] AbstractSearcherWilflPFIllA Tri r r m ■ Fib i. L n i bi [http://cs.wikipedia.Org/wiki/Speci%C3%A11n%C3%AD:Search? search=AbstractSearcher] LinearSeareher WlklľFDlA TTír ľni- Fib i. L-bbibi [http://cs.wikipedia.Org/wiki/Speci%C3%A11n%C3%AD:Search? search=LinearSearcher] Searcher Rozhraní - specifikuje, co má prohledavač umět public interface Searcher { /**Nastav do vyhledávače pole, kde se bude vyhledávat */ void set(double[] a); /** Zjisti, zda pole obsahuje čislo d */ boolean contains(double d); /**Zjisti pozici, na niž je v poli čislo d. Neni-li tam, vrať -1 */ int indexOf(double d); AbstractSearcher 5 Pokročilejší objektový návrh, dědičnost rozhraní, implementace více roz- Abstraktní třída - předek konkrétních plných implementací prohledavače public abstract class AbstractSearcher implements Searcher { // implementuje, ale // úložiště prvků JE implementováno protected double[] array; // nastaveni úložiště prvků JE implementováno public void set(double[] a) { array = a; } // rozhodnuti, zda prvek je přitomen na základě vyhledáni jeho pozice public boolean contains(double d) { return indexOf(d) >= 0; } // samotné vyhledáni prvku neni implementováno public abstract int indexOf(double d); LinearSearcher Konkrétní třída - plná implementace prohledavače - tentokrát pomocí lineárního prohledání public class LinearSearcher extends AbstractSearcher { // doimplementuje se, co zb // a to je metoda indexOf! public int indexOf(double d) { for(int i = 0; i < array.length; i++) { if(array[i] == d) { return i; } } return -1; } } 6