Rozhraní (interface) - K čemu vlastně je? – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozhraní (interface) - K čemu vlastně je? – Java – Fórum – Programujte.comRozhraní (interface) - K čemu vlastně je? – Java – Fórum – Programujte.com

 

joe0
Newbie
6. 4. 2008   #1
-
0
-

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í.

Nahlásit jako SPAM
IP: 82.100.5.–
jboss0
Newbie
6. 4. 2008   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 89.176.51.–
Honza Štěrba [br] Weby: jansterba.com, thenoobonrails.blogspot.com [br] Projekty: Manitu.cz (beta), Boomy.cz, iKomentare.cz [br]
joe0
Newbie
7. 5. 2008   #3
-
0
-

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 :-)

Nahlásit jako SPAM
IP: 82.100.5.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
8. 5. 2008   #4
-
0
-

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.


Nahlásit jako SPAM
IP: 89.24.236.–
Nightsorrow0
Newbie
8. 5. 2008   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 147.251.198.–
joe0
Newbie
10. 5. 2008   #6
-
0
-

Díky, teď už tomu rozumím víc.

Nahlásit jako SPAM
IP: 82.100.5.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

Podobná vlákna

K čemu je ? — založil Adam

Interface - private — založil jkoudis

Interface <> Implementation — založil adamlevine

K čemu slouží php? — založil Bb

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý