Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 17. diel - Rozhranie (interface)

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
codiac
Člen
Avatar
Odpovedá 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...");
}

Editované
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá 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.

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.

Avatar
codiac
Člen
Avatar
Odpovedá 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.

Editované
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá 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.

Editované
Avatar
codiac
Člen
Avatar
Odpovedá na Jan Vargovský
codiac:6.9.2013 18:31

Aha, tak díky :-)

Avatar
Odpovedá 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

Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá 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();
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

Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá 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.

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 74.