Diskuze: Otázky ohledně intefrace

Java Java Otázky ohledně intefrace

Avatar
GoliathShouldWin:

Zdravím, měl bych pár otázek ohledně interface a hlavně jeho použití po implementaci.
Když mám interface a implemetuji jej v jedné třídě, jak mohu následně použít jeho metody mimo tuto třídu ? Mohu všechny třídy, ve kterých chci použít metody tohoto interface, nechat dědit od třídy, která je implementuje (to ale pak ztrácí smysl, protože třída už nemůže dědit od žádné jiné třídy. Můžu napsat interface takové metody, která bude pracovat s supertřídou object, a tak ji budu moci použít v jakékoliv třídě, která po ní dědí (což jsou všechny třídy ve stejném balíčku, jestli se nepletu). Když s interface budu pracovat takto (se supertřídou Object) budu muset všechny použité objekty typu Object přetypovat, že ? Můžu nechat implementovat interface i jinou třídou, bez toho, abych v ní znovu implementoval metody interface (to jsem někde viděl, ale nejsem si jistý, že jsem to pochopil správně) → tedy, že další třída bude mít v hlavičce napsáno, že sice implementuje interface, ale uvnitř ní pouze její instance, které tak budou moci používat interface .... pokud byste nechápali, co tím myslím, nebudu se ničemu divit, časod času mám pocit, že ani já sám nevím, o čem mluvím :D A poslední otázka ... jakými jinými způsoby se dá interface ještě rozšířit do dalších tříd, abych mohl jeho metody použit s jehjich instancemi. Díky všem, kteří se mnou mají trpělivost :D

 
Odpovědět 11.12.2014 12:58
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na GoliathShouldWin
Silvinios:

Promiň, ale vůbec nerozumím, na co se ptáš. Konkrétně nerozumím pojmům jako použít metody interface mimo třídu, napsat interface metody, použít metodu ve třídě, instance uvnitř třídy či rozšířit interface do dalších tříd.
Dokázal bys ke svým otázkám vymyslet příklady, z kterých by bylo jasnější oč ti jde?

 
Nahoru Odpovědět 11.12.2014 21:12
Avatar
GoliathShouldWin:

V tom je ta potíž, protože si sám nejsem jistý tím, jak přesně by to mělo fungovat.
Zapomeňte tedy na původní otázky, to bude asi lepší :D Mám interface, implementuji jej v nějaké třídě, a všechny její instance (díky dědičnosti z třídy Object, která je nad všemi ostatními třídami a nechává je od ní dědit, tedy i všechny instance, všech možných tříd balíčku) mohou metody uvedené v interface používat. → tedy, mám interface Intro, třídu Introimpl, která interface Intro implementuje. Otázka zní: Kde všude mohu metody implementované v teto třídě použít ... pokud to chápu dobře, tak je mohu použít ve všech třídách, které od této třídy dědí nebo od kterých ona dědí → pomocí přetypování nebo genericity mohu pak interface použít ve všech třídách, respektive pro všechny objekty. Pokud to stále není jasné, pokuste se uvést co největší množství možných použití interface (hlavně, kde všude je mohu použít) :D
PS: Ještě jedna otázka ... Pokud implementuju interface v jedne tride, tak vsechny jeji instance (objekty) mohou tento interface pouzivat ... mohu následně implementovat stejny interface i v jinych tridach, abych tak "naucil" jejich objekty pouzivat interface, bez toho abych je znovu v techto tridach implementoval → Trida1 implements Intro → v teto tride bude telo metod z interface Intro a pak vytvorim dalsi tridu Trida2 implements Intro, ve ktere uz tela metod nebudou, ale bude je moci pouzivat ?
Vím, že je to hrozně zmatené, ale protože jsem začátečník, nevím, jak jednodušeji jednotněji podal :/

 
Nahoru Odpovědět 11.12.2014 21:39
Avatar
Rasto
Redaktor
Avatar
Odpovídá na GoliathShouldWin
Rasto:

Ahoj,

ak trieda implementuje interface MUSI prepisat vsetky metody toho interface:

public class Trieda1 implements MojInterface {

 public void interfaceMetoda1() {
    ....
 }

 public int interfaceMetoda2() {
   ...
   return ...
 }
}

public class Trieda2 implements MojInterface {

  Trieda1 objektTriedy1 = new Trieda1();

 // tiez treba prepisat metody
 public void interfaceMetoda1(){}
 public int interfaceMetoda2() {}

 // mam tu referenciu na objekt Triedy 1 - mozem teda volat metody  //definovane v Triede1

 objektTriedy1.interfaceMetoda1();
}

Vyhodou je, ze kazda trieda moze implementovat interface vlastnym sposobom - teda metody interfaceMetoda1() a interfaceMetoda2() mozu mat rozne funkcie, rozny kod a rozne uplatnenie v kazdej z tried ktora implementuje interface.
Cez referenciu na objekty tried vies potom efektivne vyuzivat metody definovane aj mimo tried, v ktorych ich vyzuivas.

Editováno 11.12.2014 23:46
 
Nahoru Odpovědět 11.12.2014 23:44
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na GoliathShouldWin
Silvinios:

Ztratil jsem se hned na začátku.
Mám interface - OK
implementuji jej v nějaké třídě - OK
a všechny její instance mohou metody uvedené v interface používat - nerozumím
(díky dědičnosti z třídy Object...) - nerozumím

 
Nahoru Odpovědět 12.12.2014 7:35
Avatar
GoliathShouldWin:

Děkuji Rastovi. Teď už to chápu lépe. Ještě jedna otázka .. Pokud budu chtít použít stejně metody z jednoho interface v dalších třídách, musím je v každé z těch tříd znovu implementovat, nebo existuje způsob, jak uvést jen odkaz na příslušné implementace ? Vím, že implementace interface se dědí spolu se třídou, ale je to nepraktické, protože dědit může třída jen z jediného předka → proto se snažím zjistit všechny způsoby jakými můžu používat interface. Díky za rady a trpělivost :D

 
Nahoru Odpovědět 12.12.2014 14:20
Avatar
Rasto
Redaktor
Avatar
Odpovídá na GoliathShouldWin
Rasto:

Nie som si isty, ci uplne chapem tvoju otazku, ale skusim odpovedat.

Dajme tomu, ze Trieda A implementuje Interface X a teda musi prepisat (definovat telo - kod) vsetkych metod, ktore su v Interface deklarovane.

Potom ak Trieda B dedi od Triedy A, ale samotna neimplementuje Interface X (cize mas ju deklarovanu iba takto: class B extends A {...} ), tak B bude mat pristup k vsetkym metodam z A - k tym, ktore pochadzaju z Interface X, aj k tym, ktore si trieda A definuje navyse.

Priklad, ktory som uviedol v mojom predoslom prispevku, je mierne odlisny: Tam som ukazal situaciu, ze aj Trieda A, aj Trieda B implementuju Interface X a obe triedy si metody z X implementuju svojim vlastnym sposobom. Trieda B v tom priklade nededila od A, preto obsahovala referenciu na objekt triedy A, cez ktory moze pristupovat k metodam triedy A.

Celkovo tato tematika nie je az taka jednoducha. Chvilu to trva, kym to cele clovek spravne pochopi, takze zelam vela trpezlivosti ;)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 15.12.2014 17:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.