NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!

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
pocitac770
Tvůrce
Avatar
Odpovídá na Jan Kunágl
pocitac770:23.8.2016 23:13

Vím, že na to určtě přijdeš sám, ale radši dám menší nápovědu, je to vlastně úplně to samé, jako napsat

int i = 2;
i + 5;

kompilátor ti to sice vyhodí jako chybu, tohle je totální nesmysl, ale jaksi by to tomu odpovídalo, jak by to fungovalo i v tomto případě (upřímně to sám nechápu, mě to zní jako docela logický statement). To, co popisuješ je používáno v různých frameworcích/kni­hovnách, které jsou pro programátory vytvořené, aby je sami nějakým svým způsobem použili. Dejme tomu, že existuje metoda .mkdir(), která vytváří složku. Vypadá to nějak takto.

mojeSlozka.mkdir();

Funguje to, úplně bezchybně, ALE! většinou je to používáno takto

if(!mojeSlozka.mkdir()){
        //nějaký další kód, viz další lekce ;)
}

Kde se z ničeho nic ta booleanová hodnota vzala? Ona tam byla i předtím, akorát jsme ji nijak nevyužili, nezajímala nás. V druhém příkladě jsme ji naopak kvůli něčemu potřebovali, tak jsme si ji zjistili, jaká vlastně je, a podle toho zareagovali, nějak jsme ji použili.

Editováno 23.8.2016 23:16
 
Odpovědět
23.8.2016 23:13
Avatar
Jan Kunágl
Člen
Avatar
Jan Kunágl:24.8.2016 14:23

Takže jsem zkusil vynechat to return a metodu:

public String grafickaMana(){
    return grafickyUkazatel(mana, maxMana);//Volá M pro grafický výpis dodaných parametrů mateřské T Bojovník
}

upravil do této podoby:

public void grafickaMana(){
        grafickyUkazatel(mana, maxMana);//Volá M pro grafický výpis dodaných parametrů mateřské T Bojovník
    }

Kompilátor to vynechání return vyhodnotil jako chybu, ještě před spuštěním programu. Jako chybná byla označena ne M grafickaMana(), ale původní příkaz tuto metodu volající:

System.out.println(((Mag)b).grafickaMana());

Myslím, že to byla jenom moje základní chyba a neuvědomění si faktu, že příkaz System.out.prin­tln() prostě vyžaduje jako argument řetězec a ne vykonání nějaké metody, která volá další metodu, bez vrácení toho String pomocí return v té volající metodě:-)

Takže jestli jsem tě dobře pochopil, když máme např. nějaký výraz (metodu), může být rozdíl ve způsobu, jak jej použijeme a co z něj chceme dostat. A to je ten základní kámen úrazu - nemíchat potom hrušky a jablka.
No nic budu o tom ještě nějakou chvíli přemýšlet, snad se do toho nezamotám :-)

Děkuji moc za užitečné odpovědi!

 
Odpovědět
24.8.2016 14:23
Avatar
David
Člen
Avatar
Odpovídá na Avev Frger
David:25.9.2016 22:48

Já to vyřešil v rychlosti tak, že jsem podmínku odstranil a použil zaokrouhlení nahoru, nechtělo se mi s tím víc zdržovat.
Navíc jsem úplnej začátečník, takže se mi ani do ničeho složitějšího pouštět nechtělo. :)

 
Odpovědět
25.9.2016 22:48
Avatar
Marek Zelený
Tvůrce
Avatar
Marek Zelený:23.10.2017 19:25

Mám dotaz týkající se konstruktoru při dědění. V článku je tento kód:

public Mag(String jmeno, int zivot, int utok, int obrana, Kostka kostka, int mana, int magickyUtok) {
        super(jmeno, zivot, utok, obrana, kostka);
        this.mana = mana;
        this.maxMana = mana;
        this.magickyUtok = magickyUtok;
}

Znamená to, že můžu předkův konstruktor zavolat kdekoliv v těle konstruktoru potomka, klidně i na konci? Třeba takhle:

public Mag(String jmeno, int zivot, int utok, int obrana, Kostka kostka, int mana, int magickyUtok) {
        this.mana = mana;
        this.maxMana = mana;
        this.magickyUtok = magickyUtok;
        super(jmeno, zivot, utok, obrana, kostka);
}

C# to (pokud vím) neumožňuje, protože se konstruktor předka volá ještě před tělem potomkova konstruktoru, ale už jsem několikrát narazil na situaci, kdy by se mi více hodilo spustit ho až po vykonání jiné části kódu (musel jsem to různě obcházet, ale nevypadalo to moc hezky).

 
Odpovědět
23.10.2017 19:25
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Marek Zelený
gcx11:23.10.2017 20:02

Ne, nemůžeš:
https://stackoverflow.com/…-constructor

A docela by mě zajímalo, v jakém případě jsi to potřeboval, vůbec mě nenapadá, k čemu by se to mohlo hodit.

 
Odpovědět
23.10.2017 20:02
Avatar
Marek Zelený
Tvůrce
Avatar
Odpovídá na gcx11
Marek Zelený:23.10.2017 21:05

Díky za odpověď i za odkaz :-)

Co se týče použití, když jsem začínal s OOP, zkoušel jsem si naprogramovat šachy. Měl jsem třídu Figurka, ze které jsem dědil jednotlivé typy figurek. Při vytvoření jsem jim přiřadil pozici na šachovnici, ta ale záležela na barvě figurky. Musel jsem potom u každého typu figurky do konstruktoru napsat prakticky stejný kód, který pracoval s již určenou pozicí.
Dneska bych to asi vyřešil nějakou metodou, ale tehdy mě to nenapadlo a hrozně mě štvalo, že nemůžu ten předkův konstruktor spustit až na konci. Mám pocit, že jsem na to narazil ještě někde, ale už si nevzpomenu kde.

 
Odpovědět
23.10.2017 21:05
Avatar
Tonda Đình Hoàng:30.12.2017 15:56

Nevíte proč u mága není
maxZivot = zivot;

Děkuju moc

 
Odpovědět
30.12.2017 15:56
Avatar
dez1nd
Člen
Avatar
Odpovídá na Tonda Đình Hoàng
dez1nd:2.1.2018 7:57

Jestli vidím dobře, je to z důvodu, že hodnotu zivot zdědil z bojovnika

class Mag extends Bojovnik {
        private int mana;
        private int maxMana;
        private int magickyUtok;
}

jen tyto 3 atributy má navíc, ostatní zdědil

Editováno 2.1.2018 7:57
 
Odpovědět
2.1.2018 7:57
Avatar
Radka Jánská:3.3.2018 21:46

Ahoj! Chtěla bych se zeptat, jak můžu naprogramovanou hru spustit jako uživatel? Dejme tomu ji pošlu kamarádce, aby ji vyzkoušela ... samozřejmě nemá NetBeans ani jiné IDE ... díky za předem za odpovědi!

 
Odpovědět
3.3.2018 21:46
Avatar
zitekv
Člen
Avatar
Odpovídá na Radka Jánská
zitekv:4.3.2018 10:56

Ahoj,
aby si to mohla kamarádka spustit musí mít nainstalován JVM (java virtual machine nebo jinak JRE java runtime enviroment) a pomocí tohoto si spustí soubor tvojeAplikace.jar, který jí pošleš.
Více informací třeba zde

 
Odpovědět
4.3.2018 10:56
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.