Zdravím,
S Javou začínám a ještě se v ní moc nevyznám, už jsem k ní přečetl poměrně dost materiálů, ale co nechápu je rozhraní.
Mohl by mi někdo vysvětlit k čemu se vlastně používá, moc to nechápu a nikde jsem na to nenašel odpověď.
Četl jsem vysvětlení jako: že je to podobné jako abstraktní třída, jen že rozhraní můžeme implementovat více do dané třídy. To ještě chápu:)
A pak, že v rozhraní jsou hlavičky metod, které musím ve třídě doprogramovat. To je taky jasné, jenže k čemu to rozhraní vlastně tedy implementovat, když ty metody si můžu doprogramovat v té třídě úplně stejně jako když žádné rozhraní nemám...
Díky za vysvětlení.
Fórum › Java
Rozhraní (interface) - K čemu vlastně je?
Rika se tomu polymorfiszmus. Java nema vicenasobnou dedicnost, ale kazda trida muze implementovat kolik rozhrani chces.
Polymorfismus:
Urcite pouzivas Collections (List, Map a pod.) zakladni praktika SW vyvoje je "program to interface". V podstate je vhodne kdykoli mas nejakou referenci na nejaky obekt pouzit interface tohoto obektu, nikoli implemetacni tridu. Hodi se to napriklad tehdy kdyz pracujes se seznamem ArrayList a zjistis ze ti nevyhovuje, pak pokud si vsude pouzival promene typu List implementaci zmenis pouze na miste kde jsi promenou vytvarel.
List list = new ArrayList();
Dedicnost:
Asi nejbeznejsim pripadem je interface Runnable. Pokud chces udelat vlastni vlakno mas dve moznosti udelat "Trida extends Thread" nebo "Trida implements Runnable" rozdil je v tom ze v prvnim pripade uz nemuzes pridat zadneho sveho predka.
Dalo by se to shnout tak ze Dedicnost se v Jave pouziva pro dedeni funkcnosti a Interfaci pro dedeni kontraktu.
jboss
Díky, odpovídám po delší době. Skoro jsem tady na to zapomněl, ještě jsem si o tom přečetl pár řádků, ale přesto musím reagovat, zřejmě jsem to nepochopil přesně :-)
Např. v příkladu 11.22. na stránce http://dione.zcu.cz/java/sbornik/11.html
Mají interface Clip. Proč by ale každá třída měla implementovat rozhraní, které deklaruje metody, které pak musím v té třídě mít. Toho samého efektu snad docílím i když rozhraní Clip implementovat nebudu a stejně si v té třídě Obrazek a dalsich mohu vytvořit metody copy() nebo se pletu?
S Javou nejsem moc kamarád, i když už jsem si na ni trochu zvykl a Collections jsem zatím moc nepoužil ("program to interface" - toto se mi líbí a založím další téma).
Díky za trpělivost :-)
Nevím, jestli to vysvětlím srozumitelně, ale pokusím se aspoň kapku :)
Hlavní výhoda (a pravděpodobně hlavní smysl) rozhraní je to, že umožňuje jednotný přístup k různým objektům. To se hodí, mají-li například (a je to opravdu jen jeden příklad z mnoha) nějakou stejnou vlastnost, která se ale pro každý objekt zjistí jinak.
Příklad. Kruh, trojúhelník a čtverec jsou jednotlivé objekty. U všech lze spočítat obsah (=stejná vlastnost) Ale tyhle obsahy se počítají každý jinak. Ano, teď si klidně můžeš napsat metody spoctiObsah pro každý objekt zvlášť a pak napsat metodu, která bude všechny tyhle třídy (objekty kruh, čtverec....a jakekoliv další geometrické tvary) využívat kdoví k čemu tak, že bude vytvářet jejich instance a používat metodu spoctiObsah každého objektu zvlášť, normálně přes tečkovou notaci (...Kruh kruh = new Kruh(); ...kruh.spoctiObsah(); ....atd.) tahle metoda by se mohla jmenovat třeba tiskniObsahy() a bude v hlavní třídě, tam, kde je main(). Když to uděláš takhle (hloupě), tak už vždycky budeš muset v téhle metodě rozlišovat, jestli zrovna pracuješ s kruhem nebo čtvercem nebo ...atp. a psát kod pro všechno zvlášť. A pozor, teď to přijde. Když použiješ rozhraní, ano, ty metody spoctiObsah() musíš stejně napsat pro všechny objekty zvlášť, ale v té metodě tiskniObsahy() máš zajištěný jednotný přístup... tzn. ať se jedná o jakejkoliv geom. tvar, tadle metoda spočte jeho obsah v jediném příkazu. Např. takovémto: tvar[i].spoctiObsah() ...kde tvar[i] - tvar je instancí našeho rozhraní, na indexu i v poli tvar je uložena nová instance libovolného objektu (např new Kruh()).
Nebo takto můžeš v nějaké jiné metodě spočíst obsah útvaru, který se skládá z různých geometrických tvarů...a další výhoda - jakmile budeš chtít nějaký tvar doplnit - tedy aby naše metoda tiskniObsahy uměla spočíst a vytisknout i obsah třeba obdelníka...tak jedna z mála věcí, co musíš udělat, je naimplementovat třídu Obdelnik s metodou - ano - spoctiObsah(). Ale v metodě tiskniObsahy se nic nemění, nic nepřidává, žádná nová instance třídy Obdelník a přesto metoda funguje. Uf...snad sem ti ještě víc nezamotala hlavu, mě už se motá, tak toho radši nechám.
Ja skúsim ešte jednoduchší príklad. Predstav si, že chceš použiť frontu Stringov, čo je Queue. Deklaruješ s ju tak, že využješ niektorú kolekciu, ktorá tú funkcionalitu poskytuje, takže s ju zadeklauješ napríklad takto:
private Queue<String> startQueue = new LinkedList<String>();
Program napíšeš a všetko funguje, no zrazu sa dozvieš, že niekto vymyslel lepšiu kolekciu, ktorá je omnoho rýchlejšia a implementuje frontu omnoho lepšie. Rozhodneš sa ju použiť a keďže si použil rozhranie Queue, tak jediné, čo zmeníš je jeden riadok, kde ju deklaruješ a nikde inde v programe nemusíš, keďže používaš Queue a ako je tá fronta implementovaná Ťa už nezaujíma.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
K čemu je ? — založil Adam
K čemu všemu je C/C++ ? — založil Moro
Interface - private — založil jkoudis
Interface <> Implementation — založil adamlevine
K čemu slouží php? — založil Bb
Moderátoři diskuze