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 8 - 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
fenrir
Člen
Avatar
fenrir:12.10.2016 20:23

Ahoj.
Proč je gandalf deklarovaný jako datový typ Bojovnik a ne jako Mag? Podle toho jak tomu rozumím, nepřináší to nic než drobnou komplikaci v nutnosti přetypování v metodě VypisBojovnika, ale žádnou výhodu to nepřináší. Proč se teda nedeklaruje rovnou jako Mag?

 
Odpovědět
12.10.2016 20:23
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na fenrir
pocitac770:12.10.2016 22:53

To je podle me jenom ukazka, ze ho muzes do Bojovnika normalne ulozit, pro pochopení např pole, co v sobě bude mít např. Bojovníky, Mágy, Střelce... jen díky tomu, že bude pole typováno "obecně" na Bojovnika a tudíž se tam v tomto stavu budou ukládat, samozřejmě s vnitřní logikou svého vlastního typu.
A pokud jde o tu metodu "VypisBojovnika()", tam to ani jinak nemůžeš udělat, jako s tím polem. Musíš umět použít jakéhokoliv bojovníka s jakýmkoliv interním typem, takže ti přes parametr projde Bojovnik -> i jeho potomci, kdybys tam dal jenom Mag, tak by ti nešel vykreslit normální Bojovnik, protože by tě to přes parametr prostě nepustilo (-> jeden z principů OOP - znovupoužotelnost kódu, a může se jednat takto i o metodu v rámci jednoho projektu)

 
Odpovědět
12.10.2016 22:53
Avatar
Jan Krejčí
Člen
Avatar
Jan Krejčí:27.1.2017 19:04

"Přepsaná metoda Utoc" Použití jen jedné podmínky. Myslím, že ušetří nějaký řádek a efekt je stejný. Doplňuji jen tak pro zajimavost. :)

public override void Utoc(Bojovnik bojovnik)
{
if (mana == maxMana)
{
mana = 0;
int uder = magickyUtok + kostka.hod();
bojovnik.Bran­Se(uder);
NastavZpravu($"{jme­no} útočí na {bojovnik.Jmeno} magickým úderem {uder}.");
}
else
{
base.Utoc(bojov­nik);
mana += 10;
}

 
Odpovědět
27.1.2017 19:04
Avatar
Jan Krejčí
Člen
Avatar
Jan Krejčí:27.1.2017 19:10
public override void Utoc(Bojovnik bojovnik)
{
    if (mana == maxMana)
    {
        int uder = magickyUtok + kostka.hod();
        mana = 0;
        bojovnik.BranSe(uder);
        NastavZpravu($"{jmeno} útočí na {bojovnik.Jmeno} magickým úderem {uder}.");
    }
    else
    {
        base.Utoc(bojovnik);
        mana += 10;
    }
 
Odpovědět
27.1.2017 19:10
Avatar
Poggy
Člen
Avatar
Poggy:5.3.2017 12:53

Ahoj, mám problém u konstruktoru mága. Změnil jsem modifikátory ve třídě Bojovnik na protected dle návodu, konstruktor jsem opsal stejně jako tady. Viz. zdroják, ale z neznámého důvodu mi to podtrhuje slovo base. VS se z nějakého důvodu nelíbí pravděbodně poslední parametr "kostka.
Konstruktor mága:

namespace Arena2
{
    class Mag: Bojovnik
    {
        private int mana;
        private int maxMana;
        private int magickyUtok;

        public Mag(string jmeno, int zivot, int utok, int obrana, Kostka kostka, int mana, int magickyUtok)
                    : base(jmeno, zivot, obrana, kostka)/*zde mám base podtrženo, chyba bude asi v parametru kostka,
                                                          ale ve třídě Bojovnik mám také parametr kostka s malým
                                                          písmenem na začátku, viz. druhý zdroják*/

        {
            this.mana = mana;
            maxMana = mana;
            this.magickyUtok = magickyUtok;
        }
    }
}

Konstruktor bojovníka:

namespace Arena2
{
    class Bojovnik
    {
        protected string jmeno;
        protected int zivot;
        protected int maxZivot;
        protected int utok;
        protected int obrana;
        protected Kostka kostka;
        private string zprava;

        public Bojovnik(string jmeno, int zivot, int utok, int obrana, Kostka kostka)
        {
            this.jmeno = jmeno;
            this.zivot = zivot;
            maxZivot = zivot;
            this.utok = utok;
            this.obrana = obrana;
            this.kostka = kostka;
        }

Poradí někdo co mám blbě? Děkuji.

 
Odpovědět
5.3.2017 12:53
Avatar
Odpovídá na Poggy
Petr Štechmüller:5.3.2017 12:58

Ahoj v tom base

base(jmeno, zivot, obrana, kostka)
//               ^ za tuhle čárku přidej proměnnou utok

Ti chybí předat proměnnou utok

Editováno 5.3.2017 12:58
Odpovědět
5.3.2017 12:58
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Poggy
Člen
Avatar
Odpovídá na Petr Štechmüller
Poggy:5.3.2017 13:07

Děkuji moc, už funguje. :-)
VS mi hlásilo chybu v kostce, ale nevšiml jsem si, že jsem nepředal vše a hledal chybu v kostce. Už jsem tu hlášku pochopil. Díky.

Editováno 5.3.2017 13:09
 
Odpovědět
5.3.2017 13:07
Avatar
Michal Dvořáček:27.5.2017 15:00

Dobrý den, můžu se prosím zeptat.

private void VypisBojovnika(Bojovnik b)
{
        Console.WriteLine(b);
        Console.Write("Život: ");
        Console.WriteLine(b.GrafickyZivot());
        if (b is Mag)
        {
                Console.Write("Mana:  ");
                Console.WriteLine(((Mag)b).GrafickaMana());
        }
}

Pokud v podmínce zjistíme, že "b" odpovídá mágovi, proč je nutné ho pak přetypovávat?

 
Odpovědět
27.5.2017 15:00
Avatar
Odpovídá na Michal Dvořáček
Petr Štechmüller:27.5.2017 15:48

Protože třída Bojovnik nezná metodu GrafickaMana. Aby bylo možné tu metodu zavolat, musí se proměnná b přetypovat.

Odpovědět
27.5.2017 15:48
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Ondřej Čech:4.11.2017 11:59

Zdravím, nevím, jestli jste si toho někdo všiml, ale když začne boj, a vypíšou se úvodní informace, tak ještě před vyhodnocením prvního boje má jeden z bojovníků ubraný život. To protože ta pauza(Thread.Sle­ep(500)) se dělá při výpisu zpráv, ale boj jako takový je vyhodnocen ihned?

 
Odpovědět
4.11.2017 11:59
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 138.