Lekce 13: Dědičnost a polymorfismus – Rozšiřování tříd v C#

Lekce 13: Dědičnost a polymorfismus – Rozšiřování tříd v C#

Dědičnost a polymorfismus jsou dva klíčové principy objektově orientovaného programování (OOP). Tyto koncepty umožňují efektivní organizaci kódu, jeho znovupoužitelnost a flexibilitu při rozšiřování funkcionalit. V této lekci si vysvětlíme, co znamená dědičnost a polymorfismus v C#, jak fungují, a ukážeme si, jak je používat v praxi.


1. Co je dědičnost?

Dědičnost umožňuje jedné třídě (tzv. odvozené třídě) přebírat vlastnosti a metody jiné třídy (tzv. základní třídy). Tento koncept umožňuje znovupoužití kódu a vytváření hierarchických vztahů mezi třídami.

  • Základní třída (parent/base class): Definuje obecné vlastnosti a chování, které mohou být sdíleny odvozenými třídami.
  • Odvozená třída (child/derived class): Rozšiřuje nebo přizpůsobuje chování základní třídy.

Příklad dědičnosti

public class Zvire
{
public string Jmeno { get; set; }

public void PredstavSe()
{
Console.WriteLine($"Jsem zvíře a jmenuji se {Jmeno}.");
}
}

// Odvozená třída
public class Pes : Zvire
{
public void StacejOhon()
{
Console.WriteLine($"{Jmeno} vrtí ocasem.");
}
}

V tomto příkladu třída Pes dědí vlastnosti a metody třídy Zvire. Můžeme tedy vytvořit instanci třídy Pes, která bude mít přístup k metodě PredstavSe ze základní třídy a zároveň k metodě StacejOhon definované v odvozené třídě.

Použití:

Pes mujPes = new Pes();
mujPes.Jmeno = "Rex";
mujPes.PredstavSe(); // Výstup: Jsem zvíře a jmenuji se Rex.
mujPes.StacejOhon(); // Výstup: Rex vrtí ocasem.

2. Klíčová slova base a přepisování metod

Klíčové slovo base

Klíčové slovo base umožňuje odvozené třídě přistupovat k metodám nebo konstruktorům základní třídy. Používá se pro:

  • Volání konstruktoru základní třídy.
  • Přístup k přetíženým metodám základní třídy.

Příklad volání konstruktoru:

public class Zvire
{
public string Jmeno { get; set; }

public Zvire(string jmeno)
{
Jmeno = jmeno;
Console.WriteLine($"Zvíře {Jmeno} bylo vytvořeno.");
}
}

public class Pes : Zvire
{
public Pes(string jmeno) : base(jmeno)
{
Console.WriteLine($"Pes {Jmeno} byl vytvořen.");
}
}

Použití:

Pes mujPes = new Pes("Rex");
// Výstup:
// Zvíře Rex bylo vytvořeno.
// Pes Rex byl vytvořen.

3. Přepisování metod a vlastností

Dědičnost umožňuje odvozené třídě přepsat metody nebo vlastnosti základní třídy. K tomu slouží klíčová slova virtual, override a sealed.

  • virtual: Označuje, že metoda nebo vlastnost v základní třídě může být přepsána.
  • override: Používá se v odvozené třídě k přepsání metody.
  • sealed: Brání dalšímu přepisování metody.

Příklad přepisování:

public class Zvire
{
public virtual void Zvuk()
{
Console.WriteLine("Zvíře vydává zvuk.");
}
}

public class Pes : Zvire
{
public override void Zvuk()
{
Console.WriteLine("Pes štěká.");
}
}

public class Kocka : Zvire
{
public override void Zvuk()
{
Console.WriteLine("Kočka mňouká.");
}
}

Použití:

Zvire mojeZvire = new Pes();
mojeZvire.Zvuk(); // Výstup: Pes štěká.

mojeZvire = new Kocka();
mojeZvire.Zvuk(); // Výstup: Kočka mňouká.

4. Co je polymorfismus?

Polymorfismus znamená, že objekty různých tříd mohou být zpracovávány stejným způsobem, pokud sdílejí stejný typ nebo rozhraní. To umožňuje volat metody na různých objektech, které mají různé implementace.

Typy polymorfismu

  1. Kompilátorový polymorfismus (přetížení metod): Více metod se stejným názvem, ale s různými parametry.
  2. Běhový polymorfismus (přepisování metod): Volání přepsané metody prostřednictvím odkazu na základní třídu.

Příklad polymorfismu:

public void ZahrajZvuk(Zvire zvire)
{
zvire.Zvuk();
}

Zvire pes = new Pes();
Zvire kocka = new Kocka();

ZahrajZvuk(pes); // Výstup: Pes štěká.
ZahrajZvuk(kocka); // Výstup: Kočka mňouká.

V tomto příkladu metoda ZahrajZvuk přijímá libovolný objekt typu Zvire a volá na něm metodu Zvuk. Díky polymorfismu každá třída poskytuje svou vlastní implementaci této metody.


5. Výhody dědičnosti a polymorfismu

  • Znovupoužitelnost kódu: Obecné metody a vlastnosti jsou definovány pouze jednou v základní třídě.
  • Flexibilita a rozšiřitelnost: Nové třídy mohou rozšiřovat funkcionalitu bez nutnosti úpravy existujícího kódu.
  • Jednodušší správa: Změny v základní třídě se automaticky projeví v odvozených třídách.

6. Praktický příklad

Představme si aplikaci pro sledování různých typů vozidel:

public class Vozidlo
{
public string SPZ { get; set; }
public virtual void Jezdi()
{
Console.WriteLine("Vozidlo jede.");
}
}

public class Auto : Vozidlo
{
public override void Jezdi()
{
Console.WriteLine($"Auto s SPZ {SPZ} jede po silnici.");
}
}

public class Lod : Vozidlo
{
public override void Jezdi()
{
Console.WriteLine($"Loď s SPZ {SPZ} pluje po vodě.");
}
}

Použití:

Vozidlo auto = new Auto { SPZ = "1A2B3C" };
auto.Jezdi(); // Výstup: Auto s SPZ 1A2B3C jede po silnici.

Vozidlo lod = new Lod { SPZ = "XYZ123" };
lod.Jezdi(); // Výstup: Loď s SPZ XYZ123 pluje po vodě.

Závěr

Dědičnost a polymorfismus jsou klíčové koncepty pro budování flexibilních, rozšiřitelných a znovupoužitelných aplikací v C#. Dědičnost umožňuje definovat obecné chování v základních třídách a specifikovat jedinečné vlastnosti v odvozených třídách. Polymorfismus pak přináší možnost práce s objekty různých typů, které sdílejí stejnou základní třídu. Tyto principy společně tvoří základ pro efektivní objektově orientovaný design.

Jirka

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

We use cookies to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners. View more
Cookies settings
Accept
Privacy & Cookie policy
Privacy & Cookies policy
Cookie name Active

Kdo jsme

Naše webová adresa je: https://www.jefta.cz.

Komentáře

Když návštěvníci zanechají na webu komentáře, shromažďujeme údaje zobrazené ve formuláři pro komentáře a také IP adresu návštěvníka a řetězec uživatelského agenta prohlížeče, abychom pomohli odhalit spam.

Anonymizovaný řetězec vytvořený z vaší e-mailové adresy (také nazývaný hash) může být poskytnut službě Gravatar, abyste zjistili, zda ji používáte. Zásady ochrany osobních údajů služby Gravatar jsou k dispozici zde: https://automattic.com/privacy/. Po schválení vašeho komentáře bude váš profilový obrázek viditelný pro veřejnost v kontextu vašeho komentáře.

Média

Pokud na web nahráváte obrázky, měli byste se vyhnout nahrávání obrázků s vloženými údaji o poloze (EXIF GPS). Návštěvníci webu si mohou stáhnout a extrahovat jakákoli data o poloze z obrázků na webu.

Soubory cookie

Pokud na našem webu zanecháte komentář, můžete se přihlásit k ukládání svého jména, e-mailové adresy a webu do souborů cookie. Jsou pro vaše pohodlí, abyste nemuseli znovu vyplňovat své údaje, když zanecháte další komentář. Tyto cookies vydrží jeden rok.

Pokud navštívíte naši přihlašovací stránku, nastavíme dočasný soubor cookie, abychom zjistili, zda váš prohlížeč přijímá soubory cookie. Tento soubor cookie neobsahuje žádné osobní údaje a po zavření prohlížeče je vyřazen.

Když se přihlásíte, nastavíme také několik souborů cookie pro uložení vašich přihlašovacích údajů a vašich voleb zobrazení obrazovky. Přihlašovací soubory cookie vydrží dva dny a soubory cookie možností obrazovky vydrží rok. Pokud zvolíte "Zapamatovat si mě", vaše přihlášení bude trvat dva týdny. Pokud se odhlásíte ze svého účtu, přihlašovací soubory cookie budou odstraněny.

Pokud upravíte nebo publikujete článek, uloží se do vašeho prohlížeče další cookie. Tento soubor cookie neobsahuje žádné osobní údaje a pouze označuje ID příspěvku článku, který jste právě upravili. Jeho platnost vyprší po 1 dni.

Vložený obsah z jiných webových stránek

Články na tomto webu mohou obsahovat vložený obsah (např. videa, obrázky, články atd.). Vložený obsah z jiných webových stránek se chová úplně stejně, jako kdyby návštěvník navštívil jinou webovou stránku.

Tyto webové stránky mohou shromažďovat údaje o vás, používat soubory cookie, vkládat další sledování třetích stran a monitorovat vaši interakci s tímto vloženým obsahem, včetně sledování vaší interakce s vloženým obsahem, pokud máte účet a jste na dané webové stránce přihlášeni.

S kým sdílíme vaše údaje

Pokud požádáte o resetování hesla, vaše IP adresa bude zahrnuta v e-mailu pro resetování.

Jak dlouho vaše údaje uchováváme

Pokud zanecháte komentář, bude komentář a jeho metadata uchována po neomezenou dobu. Je to proto, abychom mohli rozpoznat a schválit jakékoli následné komentáře automaticky, místo abychom je drželi ve frontě na moderování.

Pro uživatele, kteří se zaregistrují na našich webových stránkách (pokud existují), ukládáme také osobní údaje, které poskytují, v jejich uživatelském profilu. Všichni uživatelé mohou kdykoli zobrazit, upravit nebo smazat své osobní údaje (kromě toho, že nemohou změnit své uživatelské jméno). Správci webových stránek mohou tyto informace také zobrazit a upravovat.

Jaká práva máte nad svými údaji

Pokud máte účet na této stránce nebo jste zanechali komentáře, můžete požádat o zaslání exportovaného souboru osobních údajů, které o vás uchováváme, včetně všech údajů, které jste nám poskytli. Můžete také požádat, abychom vymazali veškeré osobní údaje, které o vás uchováváme. To nezahrnuje žádné údaje, které jsme povinni uchovávat pro administrativní, právní nebo bezpečnostní účely.

Kam se posílají vaše data

Komentáře návštěvníků mohou být kontrolovány prostřednictvím služby automatické detekce spamu.

Save settings
Cookies settings