Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskusia – 14. 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
Avatar
Lako
Nevyplnené
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?

 
Odpovedať
7.4.2013 13:04
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na
David Hartinger:7.4.2013 13:56

Prosti rozhraní?

Odpovedať
7.4.2013 13:56
New kid back on the block with a R.I.P
Avatar
Homo
Člen
Avatar
Odpovedá 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.

Odpovedať
7.4.2013 13:59
1010011 1000101 1011000
Avatar
Odpovedá 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.

 
Odpovedať
7.4.2013 14:02
Avatar
Lako
Nevyplnené
Avatar
Odpovedá 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.

 
Odpovedať
7.4.2013 14:30
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovedá 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ě ?

Odpovedať
19.5.2013 22:07
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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; }
Odpovedať
20.5.2013 9:34
New kid back on the block with a R.I.P
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovedá na David Hartinger
Petr Nymsa:20.5.2013 10:35

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

Odpovedať
20.5.2013 10:35
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Tvůrce
Avatar
Odpovedá 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.

Odpovedať
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
Odpovedá 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áš.

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

Zatiaľ nikto nevložil komentár - buď prvý!