Úkol polymorfismus

Stránky: Moodle ZČU
Kurz: BP Luboš Dokulil Sada rozšiřujících úloh v Blazor pro předmět Programování 2
Kniha: Úkol polymorfismus
Vytiskl(a): Nepřihlášený host
Datum: sobota, 17. října 2026, 23.46

Popis

V zadání najdete jednoduchý úkol, který objasňuje polymorfismus a přetěžování metod.

1. Zadání úkolu

Co je cílem zadání?

  • Vytvoření abstraktní rodičovské třídy Zvíře, abstraktní a přetížená metoda VydejZvuk().
  • Tvorba odvozených tříd Kočka, Pes, Koza, které dědí ze Zvíře a přepisují základní zvuk.
  • Sdružení instancí těchto odlišných zvířat do jednoho společného seznamu v Razor komponentě.
  • Hromadné zobrazení jmen a zvuků zvířat do tabulky pomocí jednoho společného cyklu.

Zadání

Vytvořte abstraktní bázovou třídu Zvire, která bude obsahovat vlastnost Jmeno a abstraktní metodu VydejZvuk(). Přímo do této bázové třídy přidejte i její přetíženou variantu VydejZvuk(int pocetOpakovani), která pomocí cyklu zopakuje základní zvuk tolikrát, kolik udává vstupní parametr.

Z této třídy následně odvoďte tři specializované třídy: Pes, Kocka a Koza. Tyto třídy budou dědit ze společné třídy Zvire a polymorfně přepíší metodu VydejZvuk() tak, aby každá vracela svůj specifický zvířecí zvuk.

V Razor komponentě následně zajistěte následující funkcionalitu:

  1. Inicializace dat: Vytvořte jednu sdílenou kolekci typu List<Zvire> a vložte do ní instance všech tří různých zvířat.
  2. Vykreslení tabulky: Pomocí cyklu projděte tuto sdílenou kolekci a vypište její obsah do tabulky. Tabulka bude mít tři sloupce:
    • V prvním sloupci zobrazte jméno zvířete.
    • Ve druhém sloupci vypište výsledek základní metody VydejZvuk().
    • Ve třetím sloupci demonstrujte využití přetížené metody tím, že jí předáte číselný parametr (např. hodnotu 3) a vypíšete vícenásobně zopakovaný zvuk.

Příklad, jak by mohla stránka vypadat:

Pokud se okno nenačetlo, klikněte zde.

2. Grafická nápověda

Schéma tříd

Třída Zvíře definuje společnou vlastnost jméno a předepisuje abstraktní metodu VydejZvuk. Konkrétní třídy Pes, Kočka a Koza tuto metodu povinně přepisují (override) a definují své unikátní chování (vrací 'Haf', 'Mňau', 'Méé'). Zároveň se zde  nachází přetížená verze metody, která umožňuje zvuk opakovat, a která je společná pro všechny potomky bez nutnosti dalších úprav."

3. Řešení úkolu

Třída Zvíře

namespace polymorfismus_cviceni.Models
{
    public abstract class Zvire //Z abstraktní třídy nemůžeme vytvářet instanci
    {
        public string Jmeno { get; set; } = "";    //Vytvoření vlastnosti Jmeno
        public abstract string VydejZvuk();   //Abstraktní metoda - potomci ji musejí přepsat
        public string VydejZvuk(int pocetOpakovani) //Přetížená metoda - využívá parametr
        {
            string zvuk = VydejZvuk(); //Získáme základní zvuk
            string vysledek = "";
 
            for (int i = 0; i < pocetOpakovani; i++)    //Zvuk zopakujeme tolikrát, kolik je v parametru
            {
                vysledek += zvuk + " ";
            }
 
            return vysledek.Trim(); //Vrátíme řetězec, .Trim() odstraní mezery na začátku a na konci textu
        }
    }
}
    

Třída Zvíře je definována jako abstract (abstraktní), což znamená, že z ní nelze přímo vytvářet instance (nemůžeme napsat new Zvire()). Vlastnost Jméno je společná pro všechny potomky. Ve třídě jsou definovány dvě verze metody VydejZvuk(). První je definovaná jako abstract – nemá žádné tělo a slouží jako povinný předpis, který musejí potomci přepsat. Druhá je přetížená metoda, která přijímá parametr pocetOpakovani. Tato metoda má své tělo a definuje společnou logiku: zavolá základní zvuk, který dodá konkrétní potomek a pomocí cyklu ho zopakuje.


Třídy Kočka, Pes, Koza

namespace polymorfismus_cviceni.Models
{
    public class Kocka:Zvire    //Třída kočka je potomek třídy Zvíře
    {
        public override string VydejZvuk()  //Přepisuje původní metodu VydejZvuk
        {
            return "Mňau";
        } 
    }
}
namespace polymorfismus_cviceni.Models
{
    public class Pes : Zvire    //Třída pes je potomek třídy Zvíře
    {
        public override string VydejZvuk()  //Přepisuje původní metodu VydejZvuk
        {
            return "Haf";
        }
    }
}
namespace polymorfismus_cviceni.Models
{
    public class Koza : Zvire    //Třída koza je potomek třídy Zvíře
    {
        public override string VydejZvuk()  //Přepisuje původní metodu VydejZvuk
        {
            return "Méé";
        }
    }
 
}

Pomocí dvojtečky : určujeme, že třídy Kočka, Pes a Koza jsou potomky třídy Zvíře. Protože dědí z abstraktní třídy, musejí pomocí klíčového slova override přepsat abstraktní metodu VydejZvuk. Každá třída tak definuje své vlastní chování a vrací specifický zvuk ('Mňau', 'Haf' a 'Méé').


Razor komponenta

@page "/"
 
<PageTitle>Polymorfismus</PageTitle>
 
<h1>Polymorfismus</h1>
 
<p>Všechna zvířata jsou v jednom seznamu typu <strong>List&lt;Zvire&gt;</strong>.</p>
 
<table class="table">
    <!--Tvorba tabulky pro výpis seznamu-->
    <thead>
        <tr>
            <th>Jméno</th>
            <th>Zvuk</th>
            <th>Zvuk (Přetížená metoda)</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var zvire in seznamZvirat)    //Uloží každou položku (objekt - Pes, Kočka...) ze seznamu do proměnné zvíře
        {
            <tr>
                <td>@zvire.Jmeno</td>
                <td>@zvire.VydejZvuk()</td> <!--I když pracujeme s obecným typem - zvire, spouštíme metodu konkrétního objektu - Pes, Kočka...-->
                <td>@zvire.VydejZvuk(3)</td> <!--Volání přetížené metody s parametrem 3-->
            </tr>
        }
    </tbody>
</table>
 
@code{
    private List<Models.Zvire> seznamZvirat = new List<Models.Zvire>();  //Vytváříme seznam, který umí držet cokoliv, co je "Zvire"
 
    protected override void OnInitialized()         //Metoda, která proběhne při načtení okna
    {
        seznamZvirat.Add(new Models.Pes { Jmeno = "Azor" });    //Vytvoření instancí jednotlivých zvířat a následné přidání do seznamu
        seznamZvirat.Add(new Models.Kocka { Jmeno = "Mourek" });
        seznamZvirat.Add(new Models.Koza { Jmeno = "Líza" });
    }
}

V části @code se vytváří seznamZvirat deklarovaný jako seznam objektů typu Zvíře (List<Zvire>). Při inicializaci se do tohoto seznamu přidávají konkrétní instance potomků (Pes, Kočka, Koza). V HTML části je vytvořena tabulka, která pomocí cyklu prochází tento seznam. Při prvním volání metody VydejZvuk() se pomocí polymorfismu automaticky vypíše zvuk odpovídající konkrétnímu zvířeti. Při volání metody VydejZvuk(3) s parametrem funguje přetížení metod – zavolá se metoda definovaná v rodičovské třídě, která přijme číslo a zajistí zopakování tohoto zvuku.