NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Lekce 8 - Aréna s mágem (dědičnost a polymorfismus)

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
Kit
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Kit:23.7.2013 20:27

Správně. Degraduje to třídy na pouhé pascalovské struktury. Programátor se pak hrabe z vnějšku přímo v objektech, přímo modifikuje jejich atributy. To znamená, že musí znát strukturu objektu, tedy nejen rozhraní, ale i implementaci.

David Hartinger Nejde o způsob zápisu, ale o rozhraní, které je v obou případech totožné a stejně špatné.

Odpovědět
23.7.2013 20:27
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 Kit
David Hartinger:23.7.2013 20:55

Ano, takže na to gettery a settery vůbec nemají vliv.

Odpovědět
23.7.2013 20:55
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:23.7.2013 21:31

Jistě, vliv na to nemají. Takže je tam to {get; set;} jenom proto, aby se vlk nažral (tvářilo se to jako OOP) a koza zůstala celá (programátoři stále používají imperativní způsob manipulace s atributy objektů). To není řešení problému, ale jeho obcházení.

Odpovědět
23.7.2013 21:31
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 Kit
David Hartinger:23.7.2013 21:33

Ale gettery tohle řešit nemají, je to pouze standardizace přístupu k datům objektu, abys nemusel přemýšlet jestli je tam public proměnné nebo getter, případně pak přepisovat půlku aplikace protože jsi se rozhodl dát atribut read-only.

Odpovědět
23.7.2013 21:33
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:23.7.2013 21:46

Jistě, takže pokud v C# potřebuješ veřejně přístupnou proměnnou, uděláš

public int Sekundy;

Pokud chceš omezit přístup, tak uděláš jednoduchou úpravu

public int Sekundy {get; private set;}

Rozhraní třídy se kromě omezení práva nezmění.

Pokud chci dodržovat nějaké konvence a chci atributy privat/public, stačí je rozlišovat tímto klíčovým slovem a velikostí písmene. Klauzule {get; set;} je v této podobě zcela zbytečná. Nemá na nic vliv, je to vlastně jen komentář.

public int Sekundy;

pro veřejné versus

private int sekundy;

pro soukromé.

Editováno 23.7.2013 21:47
Odpovědět
23.7.2013 21:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:23.7.2013 21:52

Zjednodušeně řečeno: Když napíšeš

public int Sekundy;

nadeklaroval jsi atribut Sekundy s veřejným getterem i setterem. Ty dvě metody tam jsou, i když jsem je tam explicitně neuvedl.

Odpovědět
23.7.2013 21:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Michal Dvorak
Neregistrovaný
Avatar
Michal Dvorak:30.7.2013 13:49

Jsem zmateny z Magovy metody NastavZpravu(), ano chapu ze je verejna a tudiz zdedena z tridy Bojovnik, ale promenna 'zprava' je private a tudiz by k ni instance gandalf nemela mit pristup ani skrze public metodu. Nebo public metoda ma pristup i ke zdedenym private promennym?
Omlouvam se jestli je to hloupy dotaz jen mi to nejak nejde pres hlavu.

 
Odpovědět
30.7.2013 13:49
Avatar
Odpovídá na
Michal Žůrek - misaz:30.7.2013 13:56

není to hloupý dotaz, public metoda může ovlivňovat private členy a to i když je zděděná (teda alespoň si to tak myslím, že by to tak mělo být).

Když dědíš tak existují i ty private, ale můžeš s nimi pracovat jen pomocí předka. Potomek se k ním nedostane.

 
Odpovědět
30.7.2013 13:56
Avatar
Michal Dvorak
Neregistrovaný
Avatar
Odpovídá na Michal Žůrek - misaz
Michal Dvorak:30.7.2013 14:02

Jo takhle, takze kdybych vytvoril ve tride Mag metodu NastavMagZpravu(), tak s ni bych se k promenne 'zprava' nedostal ale protoze NastavZpravu je od predka tak tam ten pristup je. Jestli to tak je tak moc dekuji, to by davalo smysl.

 
Odpovědět
30.7.2013 14:02
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:30.7.2013 14:10

Instance gandalf používá metodu NastavZpravu z rodičovské třídy Bojovnik. Ta metoda se při dědění nekopíruje, zůstává dál metodou třídy Bojovník a zachovává si stejná práva k objektům uvnitř.

Můžeš to také vidět tak, že gandalf je instancí dvou tříd - Mag a Bojovnik. Používá metody obou, ale pokud dojde ke kolizi jmen (překrytí), dá vždy přednost metodě třídy Mag. Metoda NastavZpravu se však vyskytuje pouze ve třídě Bojovnik a proto je použita její metoda s jejími právy ve třídě Bojovnik.

Odpovědět
30.7.2013 14:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 138.