Úkol dědičnost
| Website: | Moodle ZČU |
| Kurs: | BP Luboš Dokulil Sada rozšiřujících úloh v Blazor pro předmět Programování 2 |
| Buch: | Úkol dědičnost |
| Gedruckt von: | Nepřihlášený host |
| Datum: | Samstag, 17. Oktober 2026, 23:46 |
Beschreibung
V Zadání úkolu najdete jednoduchý úkol, který objasňuje základní principy dědičnosti v OOP.
1. Zadání úkolu
Co je cílem zadání?
- Třída Uzivatel -> třídy Student a Ucitel z ní dědí.
- Razor komponenta s oddělenými formuláři a seznamy pro zadávání a ukládání studentů a učitelů.
- Záznam se uloží do seznamu jedině při správném vyplnění všech textových polí.
Zadání
Nejprve definujte bázovou třídu Uzivatel (vlastnosti Id, Jméno, Email a metoda ZiskejZakladniInfo()). Z ní následně odvoďte třídu Student (doplněnou o třídu a ročník) a třídu Ucitel (doplněnou o kabinet a předmět).
V Razor komponentě si připravte oddělené kolekce pro studenty a učitele včetně dvou samostatných formulářů pro jejich zadávání. Aplikaci ošetřete tak, aby se nový záznam do seznamu uložil pouze tehdy, jsou-li všechna textová pole správně vyplněná.
Uložená data ihned přehledně vypisujte pod formuláři. Při výpisu každé osoby nejprve využijte zděděnou metodu ZiskejZakladniInfo() a k jejímu výstupu chytře připojte specifické informace podle konkrétní role.
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 Uzivatel slouží jako společný základ (rodič) definující identitu, jméno, e-mail a metodu pro formátovaný výpis informací. Od ní jsou odvozeny specifické třídy Student a Ucitel (potomci), které tyto základní vlastnosti automaticky přebírají a doplňují je o své unikátní údaje, jako je označení třídy nebo příslušnost ke kabinetu.
Logika tlačítka uložit

Logika za tlačítkem uložit je taková, že se nejprve ověří kompletní vyplnění všech vstupních polí formuláře. Jestliže některý údaj chybí, metoda se tichým způsobem ukončí příkazem return, čímž se předejde vzniku neúplných dat v systému. Pokud jsou všechna pole v pořádku, vytvoří se nová instance příslušné třídy, ta se vloží do seznamu pomocí metody .Add a nakonec dojde k vymazání obsahu formuláře pro usnadnění dalšího vkládání.
3. Řešení úkolu
Třída Uživatel
namespace dedicnostukol.Models { // Základní třída (předek), která definuje společné vlastnosti pro všechny uživatele public class Uzivatel { public int Id { get; set; } // Jedinečný identifikátor uživatele public string Jmeno { get; set; } = ""; // Společná vlastnost pro jméno public string Email { get; set; } = ""; // Společná vlastnost pro e-mail // Společná metoda, kterou mohou využívat všechny odvozené třídy public string ZiskejZakladniInfo() => $"{Jmeno} ({Email})"; } }
Třída Uzivatel definuje vlastnosti a metody, které jsou společné pro všechny její potomky, přičemž metoda ZiskejZakladniInfo slouží jako základní implementace pro zobrazení údajů ve formátu „Jméno (Email)“.
Třída Ucitel a Student
namespace dedicnostukol.Models { // Třída Ucitel také dědí ze třídy Uzivatel public class Ucitel : Uzivatel { public string Kabinet { get; set; } = ""; // Specifická vlastnost pouze pro učitele public string Predmet { get; set; } = ""; // Specifická vlastnost pouze pro učitele } }
namespace dedicnostukol.Models { // Třída Student dědí ze třídy Uzivatel (přebírá Jméno, Email a Id) public class Student : Uzivatel { public string Trida { get; set; } = ""; // Specifická vlastnost pouze pro studenta public int Rocnik { get; set; } // Specifická vlastnost pouze pro studenta } }
Pomocí dvojtečky : určujeme, že třídy Student a Ucitel jsou potomky třídy Uzivatel, od které automaticky přebírají společné vlastnosti i metody. Zatímco Student rozšiřuje tento základ o specifická pole pro třídu a ročník, Ucitel definuje své vlastní chování přidáním informací o kabinetu a vyučovaném předmětu, čímž obě třídy efektivně využívají mechanismus dědičnosti k eliminaci duplicitního kódu.
Razor komponenta
@page "/" <h3>Správa uživatelů - dědičnost</h3> <div class="row"> @* Sekce pro Studenta *@ <div class="col-md-6"> <div class="card p-3"> <h5>Nový Student</h5> @* Inputy pro zadání vlastností studenta *@ <input @bind="novyStudent.Jmeno" placeholder="Jméno" class="form-control mb-2" /> <input @bind="novyStudent.Email" placeholder="Email" class="form-control mb-2" /> <input @bind="novyStudent.Trida" placeholder="Třída" class="form-control mb-2" /> <button class="btn btn-success" @onclick="PridatStudenta">Uložit studenta</button> </div> </div> @* Sekce pro Učitele *@ <div class="col-md-6"> <div class="card p-3"> <h5>Nový Učitel</h5> @* Inputy pro zadání vlastností učitele *@ <input @bind="novyUcitel.Jmeno" placeholder="Jméno" class="form-control mb-2" /> <input @bind="novyUcitel.Email" placeholder="Email" class="form-control mb-2" /> <input @bind="novyUcitel.Predmet" placeholder="Předmět" class="form-control mb-2" /> <button class="btn btn-primary" @onclick="PridatUcitele">Uložit učitele</button> </div> </div> </div> <div class="row mt-4"> <div class="col-6"> <h6>Studenti</h6> <ul> @foreach (var s in studenti) // Výpis seznamu uložených studentů { <li>@s.ZiskejZakladniInfo() - Třída: @s.Trida</li> } </ul> </div> <div class="col-6"> <h6>Učitelé</h6> <ul> @foreach (var u in ucitele) // Výpis seznamu uložených učitelů { <li>@u.ZiskejZakladniInfo() - Předmět: @u.Predmet</li> } </ul> </div> </div> @code { // Vytvoření instancí pro vazbu na vstupní pole private Models.Student novyStudent = new Models.Student(); private Models.Ucitel novyUcitel = new Models.Ucitel(); // Vytvoření seznamů pro ukládání studentů a učitelů private List<Models.Student> studenti = new List<Models.Student>(); private List<Models.Ucitel> ucitele = new List<Models.Ucitel>(); private void PridatStudenta() // Metoda pro přidání studenta do seznamu { // Kontrola: Pokud je cokoliv prázdné, metoda se ukončí a nic nepřídá if (string.IsNullOrWhiteSpace(novyStudent.Jmeno) || string.IsNullOrWhiteSpace(novyStudent.Email) || string.IsNullOrWhiteSpace(novyStudent.Trida)) { return; } studenti.Add(novyStudent); // Přidání naplněné instance studenta do seznamu novyStudent = new Models.Student(); // Vyčištění instance pro nové zadání } private void PridatUcitele() // Metoda pro přidání učitele do seznamu { // Kontrola: Pokud je cokoliv prázdné, metoda se ukončí a nic nepřídá if (string.IsNullOrWhiteSpace(novyUcitel.Jmeno) || string.IsNullOrWhiteSpace(novyUcitel.Email) || string.IsNullOrWhiteSpace(novyUcitel.Predmet)) { return; } ucitele.Add(novyUcitel); // Přidání naplněné instance učitele do seznamu novyUcitel = new Models.Ucitel(); // Vyčištění instance pro nové zadání } }
V části @code se vytvářejí seznamy studenti a ucitele a pomocné instance pro vazbu na inputy. Metody pro přidání kontrolují vyplnění polí pomocí string.IsNullOrWhiteSpace – pokud je libovolné pole prázdné, příkaz return akci tichým způsobem zastaví a k přidání nedojde. V HTML části cykly foreach procházejí seznamy a vypisují uložené uživatele. Díky dědičnosti se u obou typů volá společná metoda ZiskejZakladniInfo definovaná v rodiči, ke které se v šabloně doplňují specifické vlastnosti jako třída u studenta nebo předmět u učitele.