Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: Polymorfismus > dědění konstruktoru

Aktivity
Avatar
Adam Bartl
Člen
Avatar
Adam Bartl:28.8.2021 14:31

Ahojky,
prosím o pomoc s děděním konstruktoru. Jedná se o lehkou otázku, ale nenalezl jsem na ní na internetu ani ve videích odpověď. Zde na kódu, který je ze stránky programuje.com , je zde třída MojeBázováTřída s 2 konstruktory, kde jeden je prázdný a druhý nese jeden parametr. Dále v kódu můžeme naleznout dědičnost a zděděné konstruktory v nichž už mám trochu brajgl. Moje otázka je na zděděný konstruktor s jedním parametrem, kde nerozumím proč v něm musíme mít 2x VĚK. Base nám říká, že bereme datové typy z předka, ale proč se to píše i do nového konstruktoru? Proč nový konstruktor nemůže být prázdný a celou tíhu dědění nenese jen BASE? Nebo proč nový konstruktor neobsahuje jen nové datové typy (string Jméno, string Přijimení) a BASE neřeší jen ty původní (Věk) ? Nevím, jestli je otázce rozumět, pač se mi to formuluje docela dost těžko, aby to bylo pochopitelné. Samozřejmě bych tuto otázku mohl přejít a smířit se s odpovědí, že to tak prostě je, ale rád bych tomu dokonale rozuměl a věděl, proč se to tak děje a za jakým účelem.
Poprosil bych, aby vysvětlení bylo, co nejjednodušší.
Mockrát děkuji za případné odpovědi.
Adam

public class MojeBázováTřída
{
    public MojeBázováTřída()
    {
        // První konstruktor bázové třídy

    }

    public MojeBázováTřída(int Věk)
    {
        // Druhý konstruktor bázové třídy

    }
}

public class MojeZděděnáTřída : MojeBázováTřída
// Zde dochází k dědění
{
    public MojeZděděnáTřída()
    {
        // První konstruktor zděděné třídy

    }

    public MojeZděděnáTřída(int Věk)
        : base(Věk)
    {
        // Druhý konstruktor zděděné třídy

    }
}
 
Odpovědět
28.8.2021 14:31
Avatar
JerryM
Člen
Avatar
JerryM:28.8.2021 14:48

tady to máš napsaný
https://docs.microsoft.com/…eywords/base

 
Nahoru Odpovědět
28.8.2021 14:48
Avatar
zelvicek
Člen
Avatar
zelvicek:28.8.2021 16:12

Tvá otázka je logická a já osobně bych takovýto zjednodušený zápis často využil (a zjednodušil si tak život) u jednoduchých dědění. Ale existuje spousta scénářů, ve kterých bys musel bázový konstruktor "potlačovat".

př:

class MyBase
{
public string Message {get;}
public MyBase(string message)
{
Message=message;
}
}

class MyDerivate:MyBase
{
const string _defaultMessage="xxx";
public MyDerivate():base(_defaultMessage)
{}

public MyDerivate(string prefix,string code,string suffix):base(string.Concat(prefix,code,suffix))
{}

//všimni si, že žádný konstruktor nemá shodnou definici s bázovým.
//zde bych musel nějak potlačit všechny nechtěné bázové konstruktory (a jak je definovat?) a nedej bože, aby nějaký přibyl bez mého vědomí dříve, než jej dokážu potlačit.
}

A proto je lepší opisovací opt-in pruda. Prostě ten fakt přijmi a více nemrhej časem ti daným.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
28.8.2021 16:12
Avatar
Adam Bartl
Člen
Avatar
Odpovídá na zelvicek
Adam Bartl:28.8.2021 16:33

Mockrát děkuji,
toto mi velmi pomohlo.

 
Nahoru Odpovědět
28.8.2021 16:33
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 4 zpráv z 4.