NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Mezinárodní den IT společnosti je tady! Pouze nyní můžeš získat 90 % extra kreditů při nákupu od 1199 kreditů s promo kódem AJTACI90. Tak neváhej!

Diskuze – Lekce 9 - 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
Petr Beneš
Člen
Avatar
Odpovídá na Neaktivní uživatel
Petr Beneš:4.9.2015 8:50

Jsem polichocen. Poprvé mě někdo nazval Javistou :-) Asi začnu používat výhradně anglické termíny, aby nedocházelo k omylům.

Po přečtení tohoto tutorialu jsem si myslel, že je to jak píše Neaktivní uživatel, ale na stránkách Oracle jsem se dočetl něco jiného:
https://docs.oracle.com/…control.html

Btw. díky za rychlé reakce. To jsem nečekal :-)

 
Odpovědět
4.9.2015 8:50
Avatar
Tomas Hlinovsky:9.12.2015 0:34

Zase skvělej díl, jenom mi ty ukazatele zdraví a many neladí (každej jinak dlouhej), což úplně nechápu...

 
Odpovědět
9.12.2015 0:34
Avatar
Tomas Hlinovsky:9.12.2015 1:15

Zajímavé je, že jakmile se vymění místo # ten plnej obdélník tak délka ukazatelů začne blbnout.

 
Odpovědět
9.12.2015 1:15
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:13.1.2016 13:08

Ve vzorových řešení máš malou hovadinu v Kostka.java. V přetíženém kostruktoru jednou implementuješ náhodonost včetně stěn, tak proč to potom porušuješ? Navíc ti chybí volání přetíženého konstruktoru.

public Kostka(){
        this.Kostka(6);                 //<-- zbytečná implementace
        random = new Random();  //<-- zbytečná implementace
        this(6);                                //<-- volání přetíženého konstruktoru, které zde chybí
}

public Kostka(int pocetSten){
        this.pocetSten = pocetStem();
        random = new Random();
}

Další - metoda hod(), podle této implementace může hodit i 7:) je tam jedna jednička navíc (otázka za jednoho bludišťáka: kterápak to asi bude?)

Ve třídě Bojovnik.java a Mag.java zase nemáš návratové metody pro atributy třídy - zivot a mana. Zase porušuješ zapouzdření.

Odpovědět
13.1.2016 13:08
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
svizensky
Člen
Avatar
Odpovídá na Lubor Pešek
svizensky:26.4.2016 13:38

Ta první ....

 
Odpovědět
26.4.2016 13:38
Avatar
Avev Frger
Člen
Avatar
Avev Frger:23.7.2016 17:41

V tele metody grafickyUkazatel ma podmienka

if ((pocet == 0) && (nazivu()))
  pocet = 1;

vyzerat nejako inak lebo pri zobrazovani many je ukazatel many zobrazeny pri malom mnozstve many nespravne ak mag zije.

 
Odpovědět
23.7.2016 17:41
Avatar
Avev Frger
Člen
Avatar
Odpovídá na Avev Frger
Avev Frger:23.7.2016 17:55

presnejsie po vycerpani many po utoku je zvysena o 1

Editováno 23.7.2016 17:57
 
Odpovědět
23.7.2016 17:55
Avatar
Jan Kunágl
Člen
Avatar
Jan Kunágl:23.8.2016 15:42

Zdravím, prosil bych o radu (pokročilejším se omlouvám, pro ty to bude prkotina). Celý projekt Tahovy boj je mi jakžtakž jasný, až na jednu maličkost. Jde mi o použití příkazu "return".
Vím, že když se volá nějaká metoda, aby např. vypočítala nějakou hodnotu, vrací se tato hodnota z této metody pomocí příkazu return.
Potom je další případ, že nějaká metoda volá jinou metodu, aby něco vykonala, což se v tomto tutorialu celkem běžně dělalo bez příkazu return ve volané metodě.
Další použití volání metody metodou v tomto tutorialu už mi právě jasné není. Jde o případ, že se volá nějaká metoda, která vykoná jenom to, že zavolá jinou metodu a předá jí nějaké parametry. Např.:

/*
    Metoda pro grafické ukázání stavu many mága */
    public String grafickaMana(){
        return grafickyUkazatel(mana, maxMana);//Volá M pro grafický výpis dodaných parametrů mateřské T Bojovník
    }

Proč je tam, když se z metody grafickaMana(), volá metoda grafickyUkazatel(), předtím to slovo return? Nejde přeci o to, aby poslední volaná metoda vrátila nějakou hodnotu, se kterou volající bude potom nějak pracovat, ale jde o vykonání celé posloupnosti příkazů ve volané metodě. Já chápu, že sama metoda grafickaMana() je taky volaná zase jinou metodou. Jde o to, že první volající metodě předá tato metoda tu poslední volanou metodu? A není v tom potom trochu zmatek? Nefungovalo by to i bez toho return (samozřejmě bych dal do hlavičky M potom slovo "void")? Já si myslím, že potom může být při psaní kódu docela zmatek v tom, kdy když z nějaké metody volám jinou metodu (což je, jak pozoruji, jedna z hlavních činností programu v javě), tak tam mám/nemám to "return" použít...

 
Odpovědět
23.8.2016 15:42
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Jan Kunágl
pocitac770:23.8.2016 18:43

Obecně my chceme metodami typu grafickyUkazatel -> grafickyZivot/gra­fickaMana získat String, který bude obsahovat grafické zobrazení našeho počtu životů/many. Představ si tuto konstrukci jako dědičnost (s trochou abstrakce, o tom se dovíš později). Máš jednu metodu (grafickyUkazatel), která slouží jako základ pro další metody (grafickyZivot, grafickaMana). Ty vždy pracují s jinými atributy, jednou se životem, jednou s manou, ale princip vykreslování přes trojčlenku (jestli si dobře pamatuju z dob, když jsem se to učil, teď jsem se na to nekoukal :D) je pokaždé stejný.
Trochu přimhouřím oči od své původní myšlenky, a přirovnám to k něčemu jinému. Třída-instance. Představ si třídu "Ukazatel", od které si vytvoříš 2 instance, jednu, která bude pracovat s životy, a jednu, která bude pracovat s manou, dejme tomu, že by jsme přes boxing průběžně předávali jejich hodnoty (ach ty pozdní znalosti, ignoruj mě :D), a pak by jsme nějak vraceli metodou String, který by samotný ukazatel "vykresloval". Když tak o tom přemýšlím, je to mnohem ladnější řešení, než to zdejší, ale to se stav na nedostatku znalostí.
K tomu return. Rád bych řekl TLDR, ale spíš musím říct, že jsem nepochopil, kde je problém. Return obecně ukončuje metodu a umožní metodu vrátit nějaký datový typ. Pokud metoda něco vrací (není void), tak si můžeme v kódě představit, jako by tam nebyla metoda, ale nějaký String, to jde například reálně použít při debugu, když chceš jenom otestovat třeba zarovnání a ještě nemáš hotovou logiku ukazatele, tak tam doplníš třeba

/*
    Metoda pro grafické ukázání stavu many mága */
    public String grafickaMana(){
        String s = "testovací řádek";
        return s;
    }

metoda vrací nějaký String, tudíž to přesně tak funguje. a když to máš v metodě, která taktéž vrací String, tak proč to prostě nepředat dál? Trochu rozsáhlejší typ problematiky by mohl být, kdyby jsi připravoval v metodě nějak ty parametry, třeba....

/*
    Metoda pro grafické ukázání FALEŠNÉHO #thugLife stavu many mága */
    public String grafickaFakeMana(){
        int fakeMana = mana + 10;
        return grafickyUkazatel(fakeMana, maxMana);//Volá M pro grafický výpis dodaných parametrů mateřské T Bojovník
    }

Pořád by jsi chtěl akorát předat ten výsledek metody, ale jakoby si "nascriptit" to, co se bude používat jako parametry, případně jak se budou ty parametry upravovat (viz výše), asi bude kratší v tuto chvíli napsat do kódu

String s = grafickaMana();

než

String s = grafickyUkazatel(mana, maxMana);

Takhle se to zdá jenom jako lenost, ale představ si situaci, kdy to bude něco podobného jako ta moje grafickaFakeMana, ale zpracování dat by zabralo třeba 10 řádků. To by pak byl v kódu bordel... Zdejší tutoriály se snaží lidi naučit myslet co nejefektivněji, a ukazují to na jednoduchých příkladech, aby si to vstříbili již od počátku...
Pff, doufám, že touhle vyčerpávající odpovědí jsem ti odpověděl na všechny otázky, ale kdyby něco bylo stále nejasné, klidně napiš :)

Editováno 23.8.2016 18:45
 
Odpovědět
23.8.2016 18:43
Avatar
Jan Kunágl
Člen
Avatar
Odpovídá na pocitac770
Jan Kunágl:23.8.2016 21:38

Ano, myslím, že to chápu.
V tomto případě vlastně chceme od metody (bez ohledu na to, že voláním jiné M) aby nám vrátila hodnotu - řetězec, proto to return, kterým si zároveň i tu metodu, ukončíme.
Způsob, jakým se tato metoda k výsledku dostane, tj. v tomto případě voláním další, obecnější metody, které předá "svoje" parametry, je jenom efektivnějším způsobem, jak nevyrábět další zbytečné metody pro něco, pro co už metoda je.
Ale stejně si to zkusím :-), co to udělá, když tam to return nedám a M grafickyUkazatel() v M grafickaMana() jen zavolám, bez toho return, jestli bude program fungovat, případně, že se M grafickyUkazatel() sice vykoná, ale program se tím předčasně ukončí. Každopádně dám vědět, jak to dopadlo.

Děkuji moc za tvojí reakci, která mi dala, kromě odpovědi i další podněty k přemýšlení :-)

 
Odpovědět
23.8.2016 21:38
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 91.