Úkol dědičnost

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.