NOVINKA: Pracuj až o 60 % rychleji díky akreditovanému kurzu Specialista na AI. Nyní již od 0 Kč. Zjisti více:

Diskuze – Lekce 17 - Rozhraní (interface)

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
codiac
Člen
Avatar
Odpovídá na Jan Vargovský
codiac:6.9.2013 18:04

Soubor Ptak osahuje kod

public void Dychej()
{
Console.Write­Line("Dýchám.­..");
}

public void Pipni()
{
Console.Write­Line("♫ ♫♫ ♫ ♫ ♫♫");
}

Proč se to znova opakuje v souboru PtakoJester plus
public void PlazSe()
{
Console.Write­Line("Plazím se...");
}

Editováno 6.9.2013 18:05
 
Odpovědět
6.9.2013 18:04
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na codiac
Jan Vargovský:6.9.2013 18:11

Je to jen příklad, ve skutečném příkladě by byly ty implementace různé. Kdybys nechtěl ten kód opakovat(měnit), tak by jsi zdědil PtakoJestera jen z ptáka a k tomu přidal ten interface IPtakoJester.

 
Odpovědět
6.9.2013 18:11
Avatar
codiac
Člen
Avatar
codiac:6.9.2013 18:16

Více násobnou dědičnost si představuji tak že pokud mám:
Základní skupinu 1. Zvire
Odvozená skupina I řádu 2. Pták a Ješter
Odvozena skupina II řádu 3. PtakoJešter, která výchází z toho že pták i ještěr zdědili vlastnosti nebo metody po zvířeti tudíž stačí implementovat ke tříde jen :Ptak, Jester.
Prostě mám základní kámen od kterého se to všechno odvíjí a nemusím přemýšlet nad tím jestli to zvíře dýchá protože je to automatické, bez toho zvíře nežije a proto by měl být řařen Dychej() ve zvířeti a u dvozených(v děděných) je to automaticky.

 
Odpovědět
6.9.2013 18:16
Avatar
codiac
Člen
Avatar
Odpovídá na codiac
codiac:6.9.2013 18:18

Makám na té kombinaci celý den, nějak se furt k tomu nemužu dobrat.

Mám interface na všechny skupiny plus přidaná třída Jester, ale je to problém.

Editováno 6.9.2013 18:20
 
Odpovědět
6.9.2013 18:18
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na codiac
Jan Vargovský:6.9.2013 18:28

Tohle není celá dědičnost, patří tam ještě abstraktní a virtuální metody, takže jestli chápeš jak vše funguje, tak potom později se ti to už bude implementovat lépe. Interface ti pomáhá narvat objekty do nějaké kolekce a pracovat se všema stejně, ať už je to pták nebo ještěr, obadva mají metodu Dýchej a to je to, co tě zajímá. Takhle natom příkladu nevidíš tu efektivnost. Takže jestli vše chápeš, pustil bych se vpohodě dál.

Editováno 6.9.2013 18:28
 
Odpovědět
6.9.2013 18:28
Avatar
codiac
Člen
Avatar
Odpovídá na Jan Vargovský
codiac:6.9.2013 18:31

Aha, tak díky :-)

 
Odpovědět
6.9.2013 18:31
Avatar
Odpovídá na codiac
miroslav.siska:30.10.2013 16:24

Ja to také nechapu. Respektive: Naimplementoval bych si tridu Ptak a Jester. Dále vytvorim rozhrani pro Ptak a Jester. A nasledne vytvorim Ptakojestera zdedenim z iPtak a iJester (to jsou interface). V programu vytvorim instanci Ptakojester a pak mohu volat metody jak z iPtaka tak z iJestera. Chapu to spravne? Pokud ano, tak je program spatne, jelokoz dvakrát implementuje stejne metody u ptaka i jestera v interface a zaroven kde je pro interface Ijester vytvorena zakladni trida? Je tam "bordel." Souhlasi to? Chapu spravne? Díky

 
Odpovědět
30.10.2013 16:24
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na miroslav.siska
Jan Vargovský:30.10.2013 16:39
Ptakojester a pak mohu volat metody jak z iPtaka tak z iJestera. Chapu to spravne?

Ano chápeš to správně. Jen kdybys koukl do toho kódu, tak bys zjistil, že ty tu metodu máš implementovanou jen jednou (v tom ptakojesterovi) a je jedno, skrz jaké rozhraní s ním spolupracuješ, protože impmelentuje jak IPtaka tak IJestera.

Na příkladu, když by si pracoval s tou jednou instancí ptakojestera takhle:

Ptakojeser pj = new Ptakojester();
// a můžeš s ním pracovat jako s ptakem nebo s jesterem
(pj as IPtak).Dychej();
// nebo
(pj as IJester).Dychej();

A obadva ti zavolají ten samý kód, akorát snima komunikuješ skrz jinačí rozhraní (protože ptakojester implementuje oboje, tak máš tu možnost)

Klidně potom v programu můžeš vytvořit

IPtak ptak = new Ptakojester();
IJester jester = new Ptakojester();

A pak víš, že obadva mají implementovanou metodu Dychej, ale IPtak implementuje Pipni a IJester PlazSe

Proto můžeš zavolat toto:

ptak.Dychej();
ptak.Pipni();
jester.Dychej();
jester.PlazSe();

Ale nemůžeš zavolat toto:

ptak.PlazSe();
jester.Pipni();
 
Odpovědět
30.10.2013 16:39
Avatar
miroslav.siska:30.10.2013 17:46

Chápu: (pj as IPtak).Dychej(); To jsem potřeboval :D Nešlo mi volat tyto původní metody... Jen mi šlo volat z class Ptakojester, kde bylo zase Pipni() znovu, ale jiné oproti class Ptak :D Vlastně byla metoda Pipni() z Ptak přepsaná v class Ptakojester... Postrádal jsem pak smysl proc se to dedí, když to vlastné nejde zavolat... Nakonec jsem vytvoril místo class Ptakojester interface Ptakojester: IPtak, IJester a šlo mi zavolat vše z Iptak i IJester pomocí instance Ptakojester ptakojester = new Ptakojester();... Děkuji za tyhle tutoriály. Je to super. P.S.: Když to "as" v (pj as IPtak) nebude vysvětlené později zase se poptám :D :D

 
Odpovědět
30.10.2013 17:46
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na miroslav.siska
Jan Vargovský:30.10.2013 18:21

Jednoduše pracuješ s proměnnou pj jako když je to objekt IPtak. To rozhraní ptakoještěr je celkem zavádějící, stačí když v definici třídy Ptakojester zdědíš oboje interface (IPtak, IJester) a nemusíš je složitě bez další implementace spojovat do IPtakojester.

Jinak to přetypování (pj as IPtak) jde napsat i takto

((IPtak)pj).Dychej();

To, že je ten kód nakopírovaný nic neznamená. Klidně můžeš mít Ptakojester : Ptak, IJester a doimplementuješ si jen tu metodu PlazSe ... Ale pak už jsi závislý (zkušenější neberte to doslova) na tom ptákovi, že ty ostatní metody změníš a budou dělat to samé jako u ptáka.

 
Odpovědět
30.10.2013 18:21
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 10 zpráv z 74.