Ú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.