Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

14. diel - Rozhranie (interface)

V minulej lekcii, Dátum a čas v C# - DateOnly a TimeOnly , sme si precvičili použitie štruktúr DateOnly a TimeOnly.

V minulej lekcii, Dátum a čas v C# - DateOnly a TimeOnly , sme si precvičili prácu s kolekciou List pri tvorbe elektronického diára. Dnes to v C # tutoriálu bude opäť trochu teoretické, objavíme ďalšie topí objektovo orientovaného programovania, uvedieme si totiž rozhrania.

Rozhranie

Rozhraním objektu sa myslí to, ako je objekt viditeľný zvonku. Už vieme, že objekt obsahuje nejaké metódy, tie môžu byť privátne alebo verejné. Rozhranie objektu tvorí práve jeho verejné metódy, je to spôsob, akým s určitým typom objektu môžeme komunikovať. Už sme niekoľkokrát mohli vidieť aké verejné metódy naša trieda ponúka, napr. U nášho bojovníka do arény. Trieda Bojovnik mala nasledujúce verejné metódy:

  • void Utoc(Bojovnik souper)
  • void BranSe(int uder)
  • bool Nazivu()
  • void NastavZpravu(string zprava)
  • string VratPosledniZpravu()
  • string GrafickyZivot()

    Pokiaľ si do nejakej úproměnné uložíme inštanciu bojovníka, môžeme na ňu volať metódy ako Utoc() alebo BranSe() . To stále nie je nič nové, že?

    My si však rozhrania môžeme deklarovať zvlášť a to podobným spôsobom ako napr. Triedu. Toto rozhranie potom použijeme ako dátový typ.

    Všetko si vyskúšame, ale na niečom jednoduchším, než je bojovník. Vytvorme si nový projekt, konzolovú aplikáciu a nazvime ho Rozhrani . Pridáme si nejakú jednoduchú triedu. Pretože by sa podľa môjho názoru mala teórie vysvetľovať na niečom odľahčujúcim, vytvoríme vtáka. Bude vedieť pípať, dýchať a jednoduchú recykláciu. Pridajme si triedu Ptak , bude vyzerať takto:

class Ptak
{

    public void Pipni()
    {
        Console.WriteLine("♫ ♫ ♫");
    }

    public void Dychej()
    {
        Console.WriteLine("Dýcham...");
    }

    public void Klovni()
    {
        Console.WriteLine("Kov, kov!");
    }

}

Trieda je naozaj triviálne. Prejdime do Program.cs a vytvorme si inštanciu vtáka:

Ptak ptak = new Ptak();

Teraz napíšeme ptak. a necháme Visual Studio , aby nám zobrazilo metódy na triede (možno tiež vyvolať stlačením Ctrl + Space):

metódy vtáka - Objektovo orientované programovanie v C #

Vidíme, čo na vtákovi môžeme všetko volať. Sú tam samozrejme tie 3 metódy, čo sme v triede implementovali (plus ďalšie, ktoré majú objekty v základe).

Teraz vtákovi vytvoríme rozhranie. Využijeme na to kľúčového slova interface (anglicky rozhranie). Je dobrým zvykom, že rozhranie v C # začína vždy na písmeno I (ako Interface). Vytvorme teda interface IPtak . Pravým tlačidlom klikneme na projekt, a pridáme nový item -> Interface.

Nový interface vo Visual Studiu - Objektovo orientované programovanie v C #

K projektu sa nám pridá prázdny interface . Do neho pridáme hlavičky metód, ktoré má dané rozhranie obsahovať. Samotnú implementáciu (kód metód) uvedieme až v triede, ktorá bude toto rozhranie implementovať (viď ďalej).

Do rozhrania IPtak teda pridáme hlavičky metód, schválne jednu vynecháme a pridáme iba pípanie a dýchanie:

interface IPtak
{
    void Pipni();
    void Dychej();
}

Modifikátor public neuvádzame, pretože rozhranie obsahuje vždy len verejné metódy (inak by nemalo zmysel, udáva, ako s objektom zvonku pracovať).

Vráťme sa do Program.cs a zmeňme riadok s premennou ptak tak, aby už nebola typu Ptak , ale IPtak :

IPtak ptak = new Ptak();

Kódom vyššie hovoríme, že v premennej typu IPtak očakávame objekt, ktorý obsahuje tie metódy, čo sú v rozhraní. Visual Studio nám vynadá, pretože trieda Ptak zatiaľ rozhranie IPtak neobsahuje, aj keď potrebné metódy má, nevie, že rozhranie poskytuje. Presunieme sa do triedy Ptak a nastavíme jej, že implementuje interface IPtak . Robí sa to rovnako, ako keď trieda od inej dedí:

class Ptak: IPtak
{
    // . . .

Keď sa teraz vrátime do Program.cs , riadok s premennou typu IPtak je už v poriadku. Trieda Ptak korektne implementuje rozhranie IPtak a jej inštancie môže byť do premennej tohto typu uložená.

Skúsme teraz vymazať z triedy nejakú metódu, ktorú rozhranie udáva, napr. Pipni() . Visual Studio nás upozorní, že implementácia nie je kompletný. Vráťme ju zas späť.

Opäť pridáme riadok ptak. , Visual Studio nám ponúkne nasledujúce metódy:

Metódy vtáka s rozhraním IPtak - Objektovo orientované programovanie v C #

Vidíme, že na inštanciu môžeme teraz volať iba metódy, ktoré poskytuje rozhranie. To preto, že premenná ptak je už typu IPtak , nie Ptak . Metóda Klovni() úplne chýba.

K čomu je to dobré? Výhod a využitie je viac, na prvý sme už prišli. Pomocou rozhrania dokážeme zjednodušiť rozhranie nejakého zložitého objektu a vystaviť len tú časť, ktorá sa nám v tú dobu hodí.

Ešte dodám, že nemôžeme vytvoriť inštanciu z rozhrania, tento kód nebude fungovať:

// tento kód nebude fungovať
IPtak ptak = new IPtak();

Viacnásobná dedičnosť

C # (rovnako ako väčšina programovacích jazykov) nepodporuje viacnásobnú dedičnosť. Nemôžeme teda jednu triedu oddědit z niekoľkých iných tried. Je to hlavne z toho dôvodu, že môže vzniknúť problém kolízie názvov metód v rôznych triedach, z ktorých dedíme. Viacnásobná dedičnosť sa často obchádza práve cez interface , pretože tých môžeme v triede implementovať koľko chceme. Umožňuje nám to s inštanciou potom pracovať určitým spôsobom a vôbec nás nezaujíma, akého typu objekt v skutočnosti je a čo všetko navyše obsahuje.

Pridajme si k projektu interface IJester . Bude to interface jaštera. Ten bude vedieť tiež dýchať a ešte sa plaziť:

interface IJester
{
    void PlazSe();
    void Dychej();
}

Vyskúšajme si "viacnásobnú dedičnosť", presnejšie implementáciu viac rozhraní v jednej triede. Urobme si ptakoještěr. Pridajme k projektu triedu PtakoJester.cs . Bude implementovať rozhranie IPtak a IJester :

class PtakoJester: IJester, IPtak
{
}

Keď teraz klikneme v tomto kóde pravým tlačidlom na jednotlivé interface (teda na IJester a IPtak ), môžeme v kontextovom menu zvoliť možnosť Implement Interface. Visual Studio nám potom do triedy automaticky vygeneruje potrebné metódy.

Automatická implementácia - Objektovo orientované programovanie v C #

Po implementácii oboch rozhranie vyzerá kód triedy takto:

class PtakoJester: IJester, IPtak
{
    public void PlazSe()
    {
        throw new NotImplementedException();
    }

    public void Dychej()
    {
        throw new NotImplementedException();
    }

    public void Pipni()
    {
        throw new NotImplementedException();
    }
}

Metódy doimplementujeme:

public void PlazSe()
{
    Console.WriteLine("Plazím sa...");
}

public void Dychej()
{
    Console.WriteLine("Dýcham...");
}

public void Pipni()
{
    Console.WriteLine("♫ ♫♫ ♫ ♫ ♫♫");
}

A presuňme sa do Program.cs a vytvorme si inštanciu ptakoještěr:

PtakoJester ptakojester = new PtakoJester();

Uistime sa, že má metódy ako vtáka, tak jaštera:

Metódy vtáka a jaštera - Objektovo orientované programovanie v C #

V budúcej lekcii, Pretypovania a hierarchie objektov , budeme pokračovať v podobnom duchu. Rozhranie ešte neopustíme a naučíme sa ďalšie pokročilé techniky objektovo orientovaného programovania.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1117x (23.49 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Dátum a čas v C# - DateOnly a TimeOnly
Všetky články v sekcii
Objektovo orientované programovanie v C #
Preskočiť článok
(neodporúčame)
Pretypovania a hierarchie objektov
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity