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
Lako
Neregistrovaný
Avatar
Lako:7.4.2013 13:04

Děkuji za pěkný článek. Asi zatím nejlepší vysvětlení rozhraní, které jsem dostal.
Všude slýchávám, že se má programovat prosti rozhraní... Mohl bys tuto větu objasnit - nějak srozumitelně, ale na konkrétním příkladu?

 
Odpovědět
7.4.2013 13:04
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:7.4.2013 13:56

Prosti rozhraní?

Odpovědět
7.4.2013 13:56
New kid back on the block with a R.I.P
Avatar
Homo
Člen
Avatar
Odpovídá na David Hartinger
Homo:7.4.2013 13:59

Nejspis myslel proti rozhrani.
Ze ma treba pole interfacu ITvar a v nem ma instance trid ktere toto rozhrani obsahuji.

Odpovědět
7.4.2013 13:59
1010011 1000101 1011000
Avatar
Odpovídá na
Drahomír Hanák:7.4.2013 14:02

Jednak rozhraní (ve smyslu public metod a vlastností) je něco, přes co komunikuješ s objektem. Pak je tu rozhraní jako interface, což je to klíčové slovo, ve kterém definuješ, jaké všechny public metody a vlastnosti má mít třída implementující tvoje rozhraní (interface). Programováním proti rozhraní oddělíš výčet public metod a vlastností od jeho konkrétní implementace (tzn. toho, co ty metody dělají) a to můžeš v případě potřeby změnit. Pokud bys ale změnil public metody a vlastnosti (jejich názvy, parametry atp.), bývá to většinou problematické.

Příklad:
Když máš třeba přihlášení uživatele a chceš, aby se uživatel mohl přihlásit z víc zdrojů (facebook, twitter, vlastní účet) Pokaždé to samotné ověřování bude jiné, ale pokaždé budeš chtít jedinou metodu, která ověří uživatele ze zadaných dat. Uděláš si tedy interface s metodami třeba overUzivatele() a je ti jedno, jak budeš uživatele ověřovat. O to se postarají třídy, které tvé rozhraní implementují. Pak můžeš předávat dalším třídám typ IAuthenticator a je pořád jedno, přes co se připojuješ. Kódu, který tu třídu používá, stačí vědět, že může zavolat metodu overUzivatele() Tím pádem můžeš i přidat novou možnost přihlášení (dejme tomu přes google). Když třída, poskytující přihlášení přes google implementuje tvoje rozhraní, nikdo nic nepozná a najednou ti funguje přihlašování pomocí googlu.

Hlavní myšlenka toho je, že funkčnost se může měnit, rozšiřovat, zlepšovat, ale to, jak k ní přistupuješ (přes nějaké public rozhraní) se moc často nemění, protože je to velmi problematické. To ti umožní právě programování proti rozhraní, protože předáváš jen výčet metod, se kterými všichni mohou pracovat, ale je ti jedno, jak to vnitřně funguje.

 
Odpovědět
7.4.2013 14:02
Avatar
Lako
Neregistrovaný
Avatar
Odpovídá na Drahomír Hanák
Lako:7.4.2013 14:30

@drahoš:
ó děkuji.
Pěkný příklad s tím přihlášení.

@sdraco: samozřejmě jsem myslel proti, upsal jsem se.

 
Odpovědět
7.4.2013 14:30
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:19.5.2013 22:07

Jak to přesně funguje v rozhraní s vlastnostmi? Potřeboval bych si udělat rozhraní, kde bude něco jako

bool Solid { get;}

tedy pouze lze zvenčí číst. Ve třídě, která implementuje rozhraní musím tedy připsat k Solid ještě private set,abych to mohl přes konstruktor nastavit. Určuju tím jestli můžu do objektu narazit nebo ne. Je takto vše správně ?

Odpovědět
19.5.2013 22:07
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:20.5.2013 9:34

Jo, vlastnosti se překládají interně na metody, proto mohou být v interface. Větší smysl mi ale dává:

bool Solid { get; private set; }
Odpovědět
20.5.2013 9:34
New kid back on the block with a R.I.P
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:20.5.2013 10:35

A to nastavit v interface ? Kompilátor mi tam pak hlásí chybu

Odpovědět
20.5.2013 10:35
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Kit:20.5.2013 10:42

A jakou chybu hlásí? Prozradíš nám to nebo to máme věštit z křišťálové koule?

Samozřejmě to musíš nastavit nejen v interface, ale i v implementaci.

Odpovědět
20.5.2013 10:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:20.5.2013 10:55

Nedošlo mi, že ten privátní setter to nepovolí. Takže to má být jak říkáš.

Odpovědět
20.5.2013 10:55
New kid back on the block with a R.I.P
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.