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 7 - 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
Odpovídá na Martin Petrovaj
Michaela Radimská:3.3.2018 21:03

A co: Nepritel jmenoNepritele = new StrasnyNepritel();
To by odpovídalo příkladu z článku: Uzivatel u = new Administrator("Jo­sef Nový", 25);
Myslím že chápu, co to dělá, dneska jsem vykoumala i ty override metody, díky za tip na klíčové slovo new. Ale stále nechápu, k čemu by mohlo být dobré uložit potomka do rodiče (doufám že to vysvětluji srozumitelně, s terminologií se zatím úplně nekamarádím)

 
Odpovědět
3.3.2018 21:03
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Michaela Radimská
Martin Petrovaj:3.3.2018 21:28

Ak ťa zaujíma vyslovene len v akej situácii by si napísala niečo v tom štýle ( Rodic p = new Potomok(); ), tak to ti z hlavy len tak nepoviem :-D

Prevody medzi triedami spojenými dedičnosťou sa využívajú veľa, ale väčšinou sa to robí automagicky, keď napr. ukladáš odvodený typ do kolekcie obsahujúcej objekty rodičovskej triedy, posielaš odvodenú triedu funkcii, ktorá ako parameter berie rodiča atď. To je vlastne to, na čo sa ty pýtaš, len už niekde aplikované a použité bez toho, aby si sa o to musela sama nejako extra starať :-)

Práve preto, že to za teba rieši jazyk sa takýto osobitný zápis, ktorý ty zmieňuješ veľmi nevidí. Niekedy, keď napríklad vytiahneš pomocou LINQ nejaké dáta z databázy a chceš ich rýchlo bez nejakej konverzie na list prejsť cyklom a pod., tak môžeš použiť zápis

// vráti nejaký prapodivný objekt, ale nezaujíma nás aký, prevedieme si ho na IEnumerable
IEnumerable<string> mena = from uzivatel in databaza.Users select uzivatel.Name;

foreach (string m in mena)
{
        //…
}

To je v princípe podobné tomu, na čo sa ty pýtaš, len neprevádzame z potomka na rodiča, ale na rozhranie z triedy, ktorá ho implementuje (dokonca nemusíme vôbec riešiť z akej - jedna z výhod prístupu). Pravdaže, alternatívou by bolo napr. použitie slovíčka var, ale pokiaľ by sme mena napr. vracali ako návratovú hodnotu, uvedeniu typu by sme sa asi nevyhli.

Editováno 3.3.2018 21:30
Odpovědět
3.3.2018 21:28
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Odpovídá na Martin Petrovaj
Michaela Radimská:3.3.2018 21:40

No, přesně to mne zajímalo (kdy se použije Rodic p = new Potomok()). Zaujalo mě to ve škole a tady v tutoriálu, ale už se v tom přestanu šťourat. Zřejmě je to spíš okrajová záležitost, jestli se s tím někdy potkám, pochopím :-D
Díky moc, aspoň jsem se dozvěděla další zajímavé věci :-)

 
Odpovědět
3.3.2018 21:40
Avatar
coells
Tvůrce
Avatar
Odpovídá na Michaela Radimská
coells:4.3.2018 0:56

Přimo takovýhle zápis se v C# používá při implementaci explicitního rozhranní.
Metoda hello() nepůjde zavolat přímo a musíš přetypovat.

public interface IA {
    string hello();
}

public class A : IA {
    string IA.hello() {
        return "A";
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        IA a = new A();
        Console.WriteLine(a.hello());
    }
}

V C# také budeš potkávat návrhový vzor Strategy, který používá podobný zápis implicitně.
Jiný důvod tady k takhle explicitnímu zápisu ale obvykle není.

Na širší diskuzi, kdy se to hodí, bychom museli opustit C#, který není tak úplně objektový (část principů je obětována jiné filosofii), a podívat se na jazyky, kde to smysl dává, nebo jazyk úplně opustit a zaměřit se na úlohu rozhraní a polymorfismu z hlediska objektových principů.

 
Odpovědět
4.3.2018 0:56
Avatar
Patrik Pastor:19.1.2019 12:07

chtěl bych se zeptat, když mám třídu uživatele a vní konstruktor "public Uzivatel (string jmeno, int vek). Tak v nove třídě administrátor se mi to nepodědí :

class Uzivatel
{
protected string jmeno;
private string heslo;
protected int vek;

public Uzivatel(string jmeno, int vek)
{
this.jmeno = jmeno;
this.vek = vek;
}

}
.............­.........
class Administrator : Uzivatel
{

}

vyhazuje mi to error:
Chyba CS7036 Není dán žádný argument, který by odpovídal požadovanému formálnímu parametru jmeno v Uzivatel.Uziva­tel(string, int)

Může mi prosím někdo poradit?

 
Odpovědět
19.1.2019 12:07
Avatar
Zakk
Člen
Avatar
Odpovídá na Patrik Pastor
Zakk:19.1.2019 20:14

nechce do to toho Administrátora připsat něco jako Administrátor(string jmeno, int vek):Uzivatel (jmeno, vek){}
?
Jen hádám.. neznám C#..něco podobného jsem nedávno řešil v C++ a tady to vypadá hodně podobně..

Editováno 19.1.2019 20:14
 
Odpovědět
19.1.2019 20:14
Avatar
Odpovídá na Michaela Radimská
Lukáš Macák:15.7.2019 11:07

Ahoj, možná jsem mimo, možná už tomu rozumíš, ale mně osobně přijde, že k Administrátorovi jako k Uživateli bych se choval třeba při přihlašování. Taky tam potřebuju vědět jméno, heslo, ale je mi jedno, že se přihlašuje uživatel s rozšířenými právy (administrátora).

Poradí někdo, jestli to je tak nebo jinak?

 
Odpovědět
15.7.2019 11:07
Avatar
Nositelka Změny:12.1.2020 15:14

Mám dvě otázky:

  1. Když už se používá pojem mateřská třída, nešlo by použít pojem dceřiná třída? Bylo by to takové "systematičtější".
  2. Chápu správně, že na public atributy (resp. metody) se můžeme odkazovat kdekoli (přímo v třídě, v potomcích i mimo třídu někde v kódu), na protected v třídě i v potomcích, ale nikdy mimo a na private pouze přímo v třídě, ale používat je můžeme, pokud nepřepíšeme public (protected) metody, ve kterých jsou používány.

Například, pokud bych atribut jmeno z Uzivatel ponechala jako private, ale metody typu ZiskejJmeno() nebo NastavJmeno() (nebo kterékoli jiné metody pracující s atributem jmeno) označila jako protected, fungovaly by mi tyto metody i v potomkovi, i když atribut jmeno je private, nebo jsem to pochopila špatně?

Odpovědět
12.1.2020 15:14
j.k.j
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Nositelka Změny
Jirka Jr:12.1.2020 23:26

ad 1. když už teda řešit takové věci, tak já bych byl pouze pro rodičovskou třídu a třídu potomka a do pohlaví bych vubec nezabihal.... :-)

jelikož třídy v c# a některých dalších jazycich to mají s pohlavím a dědičností dost jiné než lidi :-)

třída v c# narozdil od člověka může mit buď jednoho nebo žádného rodiče

zato díky interface mohou. mit třídy v c# společné dědičné vnější znaky, aniž by měli společného nebo dokonce jakéhokoli rodiče

a jak u třídy v c# určit pohlaví, to už je spíš otazka pro filosofa než programátora :-)

 
Odpovědět
12.1.2020 23:26
Avatar
Odpovídá na Jirka Jr
Nositelka Změny:13.1.2020 21:06

Je mi jasné, že u tříd pohlaví nefunguje. Šlo mi spíše o to, že pokud něco množí nepohlavně, pak rodiči se říká mateřský jedinec a potomkovi dceřiný jedinec, ač samotní jedinci pohlaví žádné nemají.
Celkově je zajímavé, jak je dědičnost biologii podobná - potomek dědí vše, ale jenom public je vidět (fyzická podoba), zatímco o private neví ani sám jedinec (podvědomí). A překrývání metod jsou vlastně mutace. Jenom ty interface do toho moc nezapadají. :-) Leda jako vychovatelé, kteří nám říkají, co máme umět. :-)
Jo a doufám, že chápete, že jsem to celé myslela jenom jako vtip. ;-)

Odpovědět
13.1.2020 21:06
j.k.j
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 47.