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