Lekce 11: Rozhraní a abstraktní třídy v C# – Budování flexibilních struktur

Lekce 11: Rozhraní a abstraktní třídy v C# – Budování flexibilních struktur

V objektově orientovaném programování (OOP) v jazyce C# se často setkáváme s potřebou vytvořit struktury, které sdílejí společné vlastnosti a chování, ale liší se v konkrétní implementaci. Rozhraní (interfaces) a abstraktní třídy jsou klíčovými nástroji, které nám umožňují dosáhnout tohoto cíle. Pomocí nich lze vytvořit flexibilní a rozšiřitelné kódy, které snadno zvládají změny a přidávání nových funkcí bez nutnosti velkých úprav. Tato lekce se zaměřuje na rozdíly mezi rozhraními a abstraktními třídami a ukazuje, jak a kdy je používat.

Co je rozhraní?

Rozhraní je konstrukce, která definuje sadu metod a vlastností bez implementace. Třída, která implementuje rozhraní, musí poskytnout konkrétní implementaci těchto metod a vlastností. Rozhraní jsou vhodná pro situace, kdy potřebujeme, aby různé třídy sdílely stejnou sadu metod, aniž bychom je vázali na konkrétní implementaci.

Deklarace rozhraní

Rozhraní deklarujeme pomocí klíčového slova interface. Rozhraní obsahuje pouze deklarace metod a vlastností, ale neobsahuje žádný kód uvnitř metod. Všechny metody a vlastnosti jsou implicitně public a nemohou mít žádnou jinou úroveň přístupu.

public interface IZvire
{
void Zvuk(); // Deklarace metody
string Jmeno { get; set; } // Deklarace vlastnosti
}

Zde jsme vytvořili rozhraní IZvire s metodou Zvuk a vlastností Jmeno. Každá třída, která toto rozhraní implementuje, bude muset poskytnout konkrétní implementaci metody Zvuk a vlastnosti Jmeno.

Implementace rozhraní

Když třída implementuje rozhraní, musí poskytnout implementaci všech metod a vlastností definovaných v rozhraní. K tomu se používá klíčové slovo : (dvojtečka).

public class Pes : IZvire
{
public string Jmeno { get; set; }

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

V tomto příkladu třída Pes implementuje rozhraní IZvire. Poskytuje implementaci metody Zvuk a vlastnosti Jmeno.

Výhody rozhraní

Rozhraní poskytují vysokou míru flexibility a rozšiřitelnosti. Pomocí rozhraní lze dosáhnout polymorfismu, což znamená, že různé třídy implementující stejné rozhraní mohou být používány zaměnitelně.

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

Do metody ZahrajZvuk můžeme předat jakýkoli objekt, který implementuje IZvire, což nám umožňuje volat metodu Zvuk na různých třídách, aniž bychom znali jejich konkrétní typ.

Abstraktní třídy

Abstraktní třída je třída, která nelze přímo instancovat a která může obsahovat jak metody s implementací, tak abstraktní metody (tj. metody bez implementace). Abstraktní třídy jsou vhodné v případech, kdy potřebujeme společné chování pro různé třídy a některé metody mají standardní implementaci, zatímco jiné musí být specifikovány v odvozených třídách.

Deklarace abstraktní třídy

Abstraktní třída se deklaruje pomocí klíčového slova abstract a může obsahovat abstraktní i neabstraktní (s implementací) metody.

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

public void PredstavSe()
{
Console.WriteLine($"Jsem {Jmeno}");
}

public abstract void Zvuk();
}

V tomto příkladu obsahuje abstraktní třída Zvire vlastnost Jmeno, metodu PredstavSe (která má implementaci) a abstraktní metodu Zvuk, kterou musí definovat odvozené třídy.

Dědičnost a implementace abstraktní třídy

Třída, která dědí od abstraktní třídy, musí implementovat všechny abstraktní metody.

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

V tomto případě třída Kocka dědí od abstraktní třídy Zvire a poskytuje implementaci pro metodu Zvuk. Nyní můžeme vytvořit objekt Kocka a volat na něm metody z abstraktní třídy Zvire.

Kocka mojeKocka = new Kocka { Jmeno = "Micka" };
mojeKocka.PredstavSe(); // Výstup: Jsem Micka
mojeKocka.Zvuk(); // Výstup: Kočka mňouká

Rozdíly mezi rozhraními a abstraktními třídami

VlastnostRozhraníAbstraktní třída
Deklaraceinterfaceabstract class
Implementace metodPouze deklarace, bez implementaceMůže obsahovat implementaci metod
DědičnostVícenásobná implementace možnáJedna abstraktní třída na třídu
Pole a konstruktoryNepodporujePodporuje

Rozhodování mezi rozhraním a abstraktní třídou

Rozhraní a abstraktní třídy mají rozdílné účely a volba mezi nimi závisí na tom, co chceme dosáhnout:

  • Použijte rozhraní, pokud chcete zajistit, aby různé třídy implementovaly společné metody bez ohledu na jejich dědičné vztahy.
  • Použijte abstraktní třídu, pokud chcete definovat společné chování, které budou sdílet všechny odvozené třídy, a pokud zároveň chcete poskytnout nějakou výchozí implementaci.

Například, pokud máme aplikaci pro správu zvířat a potřebujeme, aby všechny typy zvířat implementovaly metodu Zvuk, použijeme rozhraní IZvire. Pokud ale potřebujeme, aby všechna zvířata sdílela vlastnost Jmeno a metodu PredstavSe, kterou budou mít společnou, použijeme abstraktní třídu Zvire.

Příklad kombinace rozhraní a abstraktní třídy

Můžeme také využít kombinaci obou technik, kdy třída implementuje rozhraní a zároveň dědí z abstraktní třídy.

public interface IOplodeni
{
void Rozmnozovani();
}

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

public abstract void Zvuk();
}

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

public void Rozmnozovani()
{
Console.WriteLine("Pes se rozmnožuje pohlavně");
}
}

V tomto příkladu Pes dědí od abstraktní třídy Zvire a zároveň implementuje rozhraní IOplodeni. Díky tomu má všechny metody a vlastnosti definované jak v třídě Zvire, tak v rozhraní IOplodeni.

Pes mujPes = new Pes { Jmeno = "Alik" };
mujPes.Zvuk(); // Výstup: Pes štěká
mujPes.Rozmnozovani(); // Výstup: Pes se rozmnožuje pohlavně

Shrnutí a výhody použití rozhraní a abstraktních tříd

Rozhraní a abstraktní třídy jsou základními stavebními kameny flexibilních objektově orientovaných systémůRozhraní a abstraktní třídy jsou klíčové nástroje objektově orientovaného programování, které umožňují vytvořit strukturovaný, přehledný a flexibilní kód. Rozhraní definuje pouze metody a vlastnosti, které třída musí implementovat, zatímco abstraktní třída může obsahovat konkrétní implementace některých metod. Rozhraní je vhodné, když chceme, aby různé třídy sdílely stejnou strukturu metod, ale implementace byla jedinečná. Abstraktní třída naopak umožňuje vytvořit základ, který se dědí, ale s možností vlastní implementace pro specifické metody.

Například při vytváření aplikace pro správu zvířat můžeme použít abstraktní třídu Zvire, která bude obsahovat vlastnost Jmeno a společnou metodu PredstavSe. Pokud by každé zvíře mělo svůj způsob zvuku, metoda Zvuk by byla abstraktní a musela by být implementována specificky pro každé zvíře, jako je Pes nebo Kocka.

Rozhraní jako IZvire pak můžeme použít, pokud bychom chtěli, aby všechny třídy obsahovaly určitý typ chování (například Rozmnozovani). Tento přístup nám pomůže tvořit kód, který je snáze rozšiřitelný a udržovatelný.

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