Ú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:
- 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. - 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<Zvire></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.