Pokročilejší objektový návrh, dědičnost rozhraní, implementace více rozhraní. Abstraktní třídy. Obsah Abstraktní třídy ..........................................................................................................1 Abstraktní třídy ..................................................................................................................1 Abstraktní třídy (2)..............................................................................................................2 Příklad rozhraní - abstraktní třída - neabstraktní třída .................................................................2 Reálný příklad použití abstraktní třídy.............................................................................3 Rozhraní - abstraktní třída - neabstraktní třída...........................................................................3 Searcher............................................................................................................................3 AbstractSearcher.................................................................................................................3 LinearSearcher ...................................................................................................................4 Implementace více rozhraní současně..............................................................................4 Implementace více rozhraní současně......................................................................................4 Implementace více rozhraní současně - příklad .........................................................................5 Rozšiřování rozhraní....................................................................................................5 Rozšiřování rozhraní............................................................................................................5 Rozšiřování rozhraní - příklad ...............................................................................................6 Rozhraní - poznámky...........................................................................................................6 Objektové modelování v Jávě - pokračování • Abstraktní třídy (částečná implementace rozhraní) • 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í současně (vícenásobná dědičnost mezi rozhraními) Abstraktní třídy Abstraktní třídy I když Java disponuje rozhraními, někdy je vhodné určitou specifikaci implementovat pouze částečně: 1 Pokročilejší objektový návrh, dědičnost rozhraní, implementace více roz- Rozhraní Abstraktní třída Třída Abstraktní třídy (2) Abstraktní třída je tak označena v hlavičce, např.: public abstract class AbstraktniChovatel . . .WlKIPRľllA Ti r F"n t F i h i ■ iiih 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 vypisInfo() Dip kni- Fib ■ bavaVj [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 ( . . . ) íli r priT rit i. ĽBanb i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=Chovatel ch = new Abstrakt-niChovatel(...);] 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: rozhraní svet. chovatelství. ChovatelWlfCIPRRtlA Tlir r'n-i- Fík ■■ L-^a-ib i [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=svet.chovatelstvi. Chovatel] - specifikace, co má chovatel umět • svet.chovatelství.AbstraktniChovate lWlKlPRMA ílir rni- Fib i. LniBi [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=svet.chovatelstvi. Abstrakta iChovatel] - částečná implementace chovatele • svet.chovatelství.psi. ChovatelPsuWlKlPRDlA *"i " nT..:,i*j.ir. [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=svet.chovatelstvi.psi. Chova 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. 2 Specifikace Částečná implementace, typicky předek konkrétních tříd, plných implementací Implementace hraní. Abstraktní třídy. Reálný příklad použití abstraktní třídy Rozhraní - abstraktní třída - neabstraktni třída Viz demo [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=searching] proBlueJ searchingWlKlPF.MA Ihr priT Fil i. unikl 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 SearcherWlKIPEľílA "Dir ľni- Fit i. Lfiikí [http://cs.wikipedia.Org/wiki/Speci%C3%A11n%C3%AD:Search? search=Searcher] AbstractSearche rWlVIPEÍJlA riir F n t Fii u Lniki [http://cs.wikipedia.Org/wiki/Speci%C3%A11n%C3%AD:Search? search=AbstractSearcher] LinearSeareher WlVlPFľílA Ti f rni1 Fil i. l-aiih i [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 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 3 Pokročilejší objektový návrh, dědičnost rozhraní, implementace více roz- protected double[] array; // nastaveni úložiště prvků JE implementováno public void set(double[] a) { array = a; } // rozhodnuti, zda prvek je přítomen na základě vyhledáni jeho pozic 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 // 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; } } 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 • 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... 4 hraní. Abstraktní třídy. Implementace více rozhraní současně 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é • 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 - přiklad 5 Pokročilejší objektový návrh, dědičnost rozhraní, implementace více roz- Rozšiřování rozhraní - pnklad Příklad - Informing informuje „jen trochu", Wellinforming je schopen ke standardním informacím (wri-telnfo) přidat dodatečné informace (writeAdditionallnfo). public interface Informing { void writelnfo(); } public interface Wellinforming 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 Wellinforming { 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 r tit riL i. uniii [http://cs.wikipedia.org/wiki/Speci%C3%Alln%C3%AD:Search?search=java.lang.Cloneable] 6