14. diel - Rozhranie (interface) vo Visual Basic .NET
V predchádzajúcom cvičení, Riešené úlohy k 12.-13. lekciu OOP vo Visual Basic .NET, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 12.-13. lekciu OOP vo Visual Basic .NET , sme si precvičili prácu s kolekciou List pri tvorbe elektronického diára. V dnešnom VB.NET tutoriále to 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 sa s ním niekoľkokrát stretli, napr. U nášho bojovníka do arény. Trieda Bojovnik mala nasledujúce verejné metódy:
- Sub Útočia (souper As Bojovnik)
- Sub BRANS (uder As Integer)
- Function nažive () As Boolean
- Sub NastavZpravu (sprava As String)
- Function VratPosledniZpravu () As String
- Function GrafickyZivot () As String
Pokiaľ si do nejakej úproměnné uložíme inštanciu bojovníka, môžeme na ňu volať metódy ako útočí () alebo BRANS (). 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íklad 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 Rozhranie. 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, urobíme si Vtáka. Bude vedieť pípať, dýchať a jednoduchú recykláciu. Pridajme si triedu Ptak, bude vyzerať takto:
Public Class Ptak Public Sub Pipni() Console.WriteLine("♫ ♫ ♫") End Sub Public Sub Dychej() Console.WriteLine("Dýchám...") End Sub Public Sub Klovni() Console.WriteLine("Klov, klov!") End Sub End Class
Trieda je naozaj triviálne. Prejdime do Module1.vb a vytvorme si inštanciu vtáka:
Dim ptak As 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):
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 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.
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:
Public Interface IPtak Sub Pipni() Sub Dychej() End Interface
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 Module1.vb a zmeňme riadok s premennou vtak tak, aby už nebola typu Ptak, ale IPtak:
Dim ptak As IPtak = 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í, len použijeme kľúčové slovo Implements.
Public Class Ptak Implements IPtak ...
Ďalej potom musíme povedať, že sa jedná o metódu z rozhrania, za názov metódy, prípadne až za návratovú hodnotu doplníme znovu kľúčové slovo Implements a definíciu z rozhrania, trieda Ptak bude vyzerať nasledovne
Public Class Ptak Implements IPtak Public Sub Pipni() Implements IPtak.Pipni Console.WriteLine("♫ ♫ ♫") End Sub Public Sub Dychej() Implements IPtak.Dychej Console.WriteLine("Dýchám...") End Sub Public Sub Klovni() Console.WriteLine("Klov, klov!") End Sub End Class
Keď sa teraz vrátime do Module1.vb, 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, treba pípne (). 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:
Vidíme, že od inštancie môžeme teraz očakávať iba to, čo 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 fungovat Dim ptak As IPtak = New IPtak()
Viacnásobná dedičnosť
Visual Basic .NET (rovnako ako väčšina 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ť:
Public Interface IJester Sub PlazSe() Sub Dychej() End Interface
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:
Public Class PtakoJester Implements IJester, IPtak End Class
Potom, čo vypíšete všetky rozhrania a zakončíte riadok, Visual Studio vygeneruje potrebné metódy. Všimnite si metódy Dychej1 (). Metóda Dýchajte je totiž v rozhraní IPtak aj IJester, preto nám Visual Studio vygenerovalo 2.
Po implementácii oboch rozhranie vyzerá kód triedy takto:
Public Class PtakoJester Implements IJester, IPtak Public Sub Dychej() Implements IJester.Dychej Throw New NotImplementedException() End Sub Public Sub PlazSe() Implements IJester.PlazSe Throw New NotImplementedException() End Sub Public Sub IPtak_Dychej() Implements IPtak.Dychej Throw New NotImplementedException() End Sub Public Sub Pipni() Implements IPtak.Pipni Throw New NotImplementedException() End Sub End Class
Keďže dýchanie bude rovnaké, metódu IPtak_Dychej () odstránime au metódy dýchajte () pridáme za Implements aj IPtak.Dychej. Metódy ďalej doimplementujeme:
Public Sub Dychej() Implements IJester.Dychej, IPtak.Dychej Console.WriteLine("Dýchám...") End Sub Public Sub PlazSe() Implements IJester.PlazSe Console.WriteLine("Plazím se...") End Sub Public Sub Pipni() Implements IPtak.Pipni Console.WriteLine("♫ ♫ ♫") End Sub
Presuňme sa do Module1.vb a vytvorme si inštanciu ptakoještěr:
Dim ptak As PtakoJester = New PtakoJester()
Uistime sa, že má metódy ako vtáka, tak jaštera:
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é 192x (74.09 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB