Předvánoční slevová akce Java týden
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

Diskuze: Volání správného konstruktoru při dědění

Aktivity (4)
Avatar
Ondra Toman
Člen
Avatar
Ondra Toman:1. srpna 0:20

Předem říkám že název není úplně odpovídající ale nic lepšího mě nenapadlo. K věci: udělal jsem si bankovní program kde mam třídu klient, banka a účet. banka dědí z klienta a klient si v konstruktoru vytváří účet. taky je tam výstup do konzole kde se mi vypíše že se vytvořila instance klienta. jenže když vytvořim instanci banky tak nechci aby se vypsalo vytvoření klienta ale vytvoření banky. jak toho docílit?

class Klient
{
        public jmeno { get; protected set;}

        public Klient(string jmeno)
        {
                this.jmeno = jmeno;
                Ucet ucet = new Ucet();
                Console.WriteLine("Klient vytvořen");
        }
}

class Banka: Klient
{
        public Banka(string jmeno): base(jmeno)
        {
                Console.WriteLine("Banka vytvořena");
        }
}

Zkusil jsem:

Chci docílit:

 
Odpovědět
1. srpna 0:20
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Ondra Toman
Martin Petrovaj:1. srpna 0:29

Nedocieliš. Celé to spočíva v tom, že konštruktor banky najprv volá konštruktor triedy, z ktorej je banka oddedená (to je to volanie "base(jmeno)").

Pokiaľ pôvodná trieda nemá bezparametrický konštruktor, tak sa tomu jednoducho nevyhneš. Niektorý base konštruktor zavolať proste musíš - inak by hrozilo, že premenné, ktoré banka zdedila z klienta nebudú nainicializované a tým pádom tvoj objekt nebude fungovať správne.

Nahoru Odpovědět
1. srpna 0:29
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na Martin Petrovaj
Ondra Toman:1. srpna 0:34

dobře a jak bys to tedy udělal ty? přijde mi hloupé při každém vytváření banky/ klienta psát další řádek kterej to vypíše.

 
Nahoru Odpovědět
1. srpna 0:34
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Ondra Toman
Martin Petrovaj:1. srpna 1:22
  1. Nepoznám tvoj use case. Netuším, čo chceš docieliť a aký má význam vypisovať takto v konštruktore do konzoly.
  2. Ak chceš vytvoriť napr. nejaké logovanie pri založení nového konta alebo čohokoľvek podobného, tak by som to na 90% nerobil v konštruktore, ale v kóde, ktorý tie nové inštancie vytvára, prípadne pri ukladaní nového konta do DB.
  3. Či už by riešenie z bodu 2 malo väčší zmysel alebo nie, premyslel by som si návrh tvojej aplikácie. Dedičnosť "Klient <- Banka" mi osobne nepripadá ako najlogickejší vzťah v akomkoľvek IS. Opäť sme ale pri tom, že nepoznám tvoje zadanie a aké problémy či use cases sa snažíš riešiť.
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
1. srpna 1:22
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Ondra Toman
Člen
Avatar
Odpovídá na Martin Petrovaj
Ondra Toman:1. srpna 10:58

myšlenka je taková že budu mít server banky (to dělám teď) a ten bude ovládat veškerou logiku a potom bude WPF klient který se připojí přes internet a bude jen posílat požadavky na server.
tu dědičnost jsem tak zvolil jelikož ta banka stejně jako klient má jméno, účet, funkci na poslání peněz a výpis zůstatku a navíc má ještě směnu měny takže mi to přišlo logické. ten výstup na server je tu jenom jako info pro mě abych věděl co ten server dělá.
každopádně to udělám tak jak jsi psal v bodu 2. dává to asi největší smysl.
a jestli ti v tom návrhu něco přijde divné tak mi klidně napiš. tenhle projekt dělám především proto abych se něco naučil.

 
Nahoru Odpovědět
1. srpna 10:58
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 5 zpráv z 5.