Avatar
vodslon
Člen
Avatar
vodslon:

Ahoj,

Co mě trochu mate, vysvětlíte mi to někdo, třeba i po skypu, chci v tom mít 100 % jasno. Já jsem na to narazil, třeba není z praktického hlediska důvod to používat ale

Situace:

Iterface IMatka
**{ void Rekni() }**

mám interface potom udělám třídu a implementuji

Class Potomek : IMatka
**
{
 void Rekni() **{ Console.WriteLine("Něco") }**

 public string promenaVPotomku;

 tady udělám konstruktor a naplním this.promenaVPotomku = string s z konstruktoru
}**

pak mám třeba main a tam udělám IMatka matka = new Potomek("promena")

a ted ten problém když dám matka. tak vidím metodu Rekni, ale nevidím promenaVPotomku, to dává logiku, ale když dáš debug, tak vidím že matka má string promena v sobě a když udělám Potomek p = matka as Potomek tak na dalším řádku dám p. tak tam promenaVPotomku a můžu si jí vypsat, proč to nejde rovnou a nebo jde to udělat jednodušeji?

 
Odpovědět 18.6.2015 11:12
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vodslon
Jan Vargovský:

Tohle je hodně učebnicový příklad. Vidíš pouze a jen to, co ten interface implementuje. Kdybys měl třeba interface, který má v sobě metodu, která ti vrátí soubor. Pak máš několik možností jak ho získat, stáhnout z internetu, najít ho na disku, vytvořit nějaký mock, ... Tyhle všechny věci by sis nadefinoval do vlastních tříd, které by implementovali ten interface. Pak by si měl nějakou fasádu (návrhový vzor), který by ti vrátil instanci podle podmínek, které jsou. Poprvé potřebuješ ten soubor a zároveň ti funguje internet? Stáhneš z netu. Poprvé potřebuješ ten soubor, ale nejde ti internet? Namockuješ ho. Už jsi někdy stahoval ten soubor? Najdeš ho na disku.

Tohle taky není moc šťastný případ, ale třeba pochytíš tu podstatu interfacu. Jednoduše komunikuješ skrz ten jeden kanál, i když ani nemusíš vědět co za konkrétní instanci v něm je. Jediné co jistě víš, že umí vše co ty potřebuješ.

 
Nahoru Odpovědět 18.6.2015 11:31
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na vodslon
patrik.valkovic:

Dává to možnost použít interface v případech, kde nepotřebuješ znát přesný typ proměnné. Dám příklad, představ si, že máš třídu, která dokáže říct objektům, kde se mají vykreslit, ale už je jí jedno, jaký objekt se vykreslí. Dejme tomu, že vykreslovatelné objekty budou obdelník a kruh. Kruh potřebuje vědět poloměr, zatímco obdelník potřebuje vědět svou výšku a šířku. Ale oba objekty jdou vykreslit, tedy budou mít společnou metodu vykresli(kde). V původní třídě (ta co udává, kam se mají objekty vykreslit), poté nepotřebuješ vědět, co se vykresluje, jen řekneš kam, ale zároveň ty objektu potřebuješ někam uložit, a společným jmenovatelem je právě ono rozhraní (interface).

interface IObjektyJdouciVykreslit
{
    public void Vykresli(kde);
}
class Ctverec : IObjektyJdouciVykreslit
{
    public int vyska;
    public int sirka;
    public void Vykresli(kde) { /* vykresleni obdelniku */ }
}
class Kruh : IObjektyJdouciVykreslit
{
    public int polomer;
    public void Vykresli(kde) { /* vykresleni kruhu */ }
}
class TridaKteraVykresluje
{
    public IIObjektyJdouciVykreslit[] ObjektyKVykresleni;
    public void VykresliVsechnyObjekty()
    {
        //tady je ta zásadní část, nepotřebuješ vědět co je to za objekt
        //pouze jej chceš vykreslit
        foreach(IObjektyJdouciVykreslit ObjektKVykresleni in ObjektyKVykresleni)
        {
             /* Zjisteni, kam se objekt vykresli */
             ObjektKVykresleni.Vykresli(kde)
             //jednou se muze vkyreslit obdelnik, podruhe kruh
             //ale tuto tridu uz nezajima co se vykresli, pouze kde
        }
    }
}
Editováno 18.6.2015 11:54
Nahoru Odpovědět 18.6.2015 11:53
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
vodslon
Člen
Avatar
Odpovídá na Jan Vargovský
vodslon:

Já myslím, že chápu podstatu Interfacu :-), já jsem právě u toho ted narazil u návrhového vzoru, který řešil různé verze uložených dat a přes jeden interface se k různě uloženým datům dalo přistupovat. Tuším, že to má jméno Iterator.

Celkově by vlastně šlo použít reflexe a dynamicky to přetypovávat?

Mě spíše prostě o to, že vlastně ten Objekt Interface si sebou nese všechny "data" té třídy a nejde se k nim dostat dokud se to nepřetypuje.

Vím, že tomu hodně rozumíš :-), je dobré používat NamedPipe pro předávání inforamcí mezi Service a aplikací ? Máš s tím zkušenosit?

 
Nahoru Odpovědět 18.6.2015 12:06
Avatar
vodslon
Člen
Avatar
Odpovídá na patrik.valkovic
vodslon:

Rozumím, děkuji za napsání, já se to snažím hodně používat, ono se to dneska i chce, jenom mě zarazilo to, že to z toho nejde něják vydolovat nebo jak bych to řekl :). Že v debagu to vidíš, jak to má nějáké proměné a nemůžeš se na ně odkázat, možná jsem tu otázku napsal blbě, ale zase když si to někdo přečte, tak díky Tobě bude mít krásnou ukázku, jak fungují interface :)

 
Nahoru Odpovědět 18.6.2015 12:17
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 5 zpráv z 5.