14. díl - Rozhraní (interface) ve Visual Basic .NET

Ostatní jazyky Visual Basic .NET Objektově orientované programování Rozhraní (interface) ve Visual Basic .NET

V minulém dílu seriálu tutoriálů o Visual Basic .NET jsme si procvičili práci s kolekcí List při tvorbě elektronického diáře. Dnes to bude opět trochu teoretické, objevíme další taje objektově orientovaného programování, uvedeme si totiž rozhraní.

Rozhraní

Rozhraním objektu se myslí to, jak je objekt viditelný zvenku. Již víme, že objekt obsahuje nějaké metody, ty mohou být privátní nebo veřejné. Rozhraní objektu tvoří právě jeho veřejné metody, je to způsob, jakým s určitým typem objektu můžeme komunikovat. Již jsme se s ním několikrát setkali, např. u našeho bojovníka do arény. Třída Bojovnik měla následující veřejné metody:

  • Sub Utoc(souper As Bojovnik)
  • Sub BranSe(uder As Integer)
  • Function Nazivu() As Boolean
  • Sub NastavZpravu(zprava As String)
  • Function VratPosledniZ­pravu() As String
  • Function GrafickyZivot() As String

Pokud si do nějaké úproměnné uložíme instanci bojovníka, můžeme na ni volat metody jako Utoc() nebo BranSe(). To pořád není nic nového, že?

My si však rozhraní můžeme deklarovat zvlášť a to podobným způsobem jako třeba třídu. Toto rozhraní poté použijeme jako datový typ.

Vše si vyzkoušíme, ale na něčem jednodušším, než je bojovník. Vytvořme si nový projekt, konzolovou aplikaci a nazvěme ho Rozhrani. Přidáme si nějakou jednoduchou třídu. Protože by se dle mého názoru měla teorie vysvětlovat na něčem odlehčujícím, uděláme si Ptáka. Bude umět pípat, dýchat a klovat. Přidejme si třídu Ptak, bude vypadat 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

Třída je opravdu triviální. Přejděme do Module1.vb a vytvořme si instanci ptáka:

Dim ptak As Ptak = New Ptak()

Nyní napíšeme ptak. a necháme Visual Studio, aby nám zobrazilo metody na třídě (lze také vyvolat stiskem ctrl + space):

Metody ptáka

Vidíme, co na ptákovi můžeme vše volat, jsou tam samozřejmě ty 3 metody, co jsme ve třídě implementovali (plus další, které mají objekty v základu).

Nyní ptákovi vytvoříme rozhraní. Využijeme k tomu klíčového slova Interface (anglicky rozhraní). Je dobrým zvykem, že rozhraní začíná vždy na písmeno I (jako Interface). Vytvořme tedy interface IPtak. Pravým tlačítkem klikneme na projekt, a přidáme nový item - Interface.

Nový interface ve Visual Studiu

K projektu se nám přidá prázdný interface. Do něj přidáme hlavičky metod, které má dané rozhraní obsahovat. Samotnou implementaci (kód metod) uvedeme až ve třídě, která bude toto rozhraní implementovat (viz dále).

Do rozhraní IPtak tedy přidáme hlavičky metod, schválně jednu vynecháme a přidáme pouze Pípání a Dýchání:

Public Interface IPtak
        Sub Pipni()
        Sub Dychej()
End Interface

Modifikátor Public neuvádíme, protože rozhraní obsahuje vždy pouze veřejné metody (jinak by nemělo smysl, udává, jak s objektem zvenku pracovat).

Vraťme se do Module1.vb a změňme řádek s proměnnou ptak tak, aby již nebyla typu Ptak, ale IPtak:

Dim ptak As IPtak = New Ptak()

Kódem výše říkáme, že v proměnné typu IPtak očekáváme objekt, který obsahuje ty metody, co jsou v rozhraní. Visual Studio nám vyhubuje, protože třída Ptak zatím rozhraní IPtak neobsahuje, i když potřebné metody má, neví, že rozhraní poskytuje. Přesuneme se do třídy Ptak a nastavíme jí, že implementuje interface IPtak. Dělá se to stejně, jako když třída od jiné dědí, jen použijeme klíčové slovo Implements.

Public Class Ptak
        Implements IPtak
        ...

Dále pak musíme říci, že se jedná o metodu z rozhraní, za název metody, případně až za návratovou hodnotu doplníme znovu klíčové slovo Implements a definici z rozhraní, třída Ptak bude vypadat následovně

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

Když se nyní vrátíme do Module1.vb, řádek s proměnnou typu IPtak je již v pořádku, třída Ptak korektně implementuje rozhraní IPtak a její instance může být do proměnné tohoto typu uložena.

Zkusme nyní vymazat ze třídy nějakou metodu, kterou rozhraní udává, třeba Pipni(). Visual Studio nás upozorní, že implementace není kompletní. Vraťme ji zas zpět.

Opět přidáme řádek ptak., Visual Studio nám nabídne následující metody:

Metody ptáka s rozhraním IPtak

Vidíme, že od instance můžeme nyní očekávat pouze to, co poskytuje rozhraní. To proto, že proměnná ptak je již typu IPtak, nikoli Ptak. Metoda Klovni() úplně chybí.

K čemu je to dobré? Výhod a využití je více, na první jsme již přišli. Pomocí rozhraní dokážeme zjednodušit rozhraní nějakého složitého objektu a vystavit jen tu část, která se nám v tu dobu hodí.

Ještě dodám, že nemůžeme vytvořit instanci z rozhraní, tento kód nebude fungovat:

' tento kód nebude fungovat
Dim ptak As IPtak = New IPtak()

Vícenásobná dědičnost

Visual Basic .NET (stejně jako většina jazyků) nepodporuje vícenásobnou dědičnost. Nemůžeme tedy jednu třídu oddědit z několika jiných tříd. Je to hlavně z toho důvodu, že může vyvstat problém kolize názvů metod v různých třídách, ze kterých dědíme. Vícenásobná dědičnost se často obchází právě přes interface, protože těch můžeme ve třídě implementovat kolik chceme. Umožňuje nám to s instancí poté pracovat určitým způsobem a vůbec nás nezajímá, jakého typu objekt ve skutečnosti je a co všechno navíc obsahuje.

Přidejme si k projektu interface IJester. Bude to interface ještěra. Ten bude umět také dýchat a ještě se plazit:

Public Interface IJester
        Sub PlazSe()
        Sub Dychej()
End Interface

Vyzkoušejme si "vícenásobnou dědičnost", přesněji implementaci více rozhraní v jedné třídě. Udělejme si ptakoještěra. Přidejme k projektu třídu PtakoJester.cs. Bude implementovat rozhraní IPtak a IJester:

Public Class PtakoJester
        Implements IJester, IPtak
End Class

Poté, co vypíšete všechna rozhraní a zakončíte řádek, Visual Studio vygeneruje potřebné metody. Všimněte si metody Dychej1(). Metoda Dychej je totiž v rozhraní IPtak i IJester, proto nám Visual Studio vygenerovalo 2.

Po implementaci obou rozhraní vypadá kód třídy 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

Jelikož dýchání bude stejné, metodu IPtak_Dychej() odstraníme a u metody Dychej() přidáme za Implements i IPtak.Dychej. Metody dále 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

Přesuňme se do Module1.vb a vytvořme si instanci ptakoještěra:

Dim ptak As PtakoJester = New PtakoJester()

Ujistěme se, že má metody jak ptáka, tak ještěra:

Metody ptáka a ještěra

Příště budeme pokračovat v podobném duchu, rozhraní ještě neopustíme a naučíme se další pokročilé techniky objektově orientovaného programování.


 

Stáhnout

Staženo 177x (74.09 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

  Aktivity (2)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 



 

 

Komentáře

Avatar
HellCoder
Neregistrovaný
Avatar
HellCoder:

Mas tam mensi chybu ;) Využijeme k tomu klíčového slova Interface (anglicky rozhraní).
Tu zavorku bych z tama oddelal.

 
Odpovědět 4.6.2013 19:06
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 4.6.2013 21:08
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
dave_23
Člen
Avatar
dave_23:

jen drobnost...hned ze začátku u toho seznamu metod třídy Bojovnik ti v parametru metody Utoc asi zůstala C#-ovská syntaxe ;)

 
Odpovědět 22.10.2014 14:22
Avatar
Odpovědět 22.10.2014 15:04
Nesnáším {}, proto se jim vyhýbám.
Avatar
Jaroslav Trojan:

Proč mi nejde vypsat věk a heslo v tomto kódu :

Module Module1
Public jmeno As String = "Jarda Trojan"
Public vek As Integer = 80
Public heslo As String = "bukovka"
Sub Main()
Dim u As New Uzivatel("Olda Novák", 87, "dům")
Dim a As New Administrator("Jar­da Trojan", 80, "bukovka")
'Dim u As Uzivatel = New Administrator("Jar­da Trojan", 80, "bukovka")

If TypeOf u Is Administrator Then
Console.Write­Line("je to administrator")
Else
Console.Write­Line("je to uživatel")
End If
Console.Write­Line(u)
Console.Write­Line(a)
Console.WriteLine()

Console.Write­Line(u.Vypis(jme­no, vek, heslo))
Console.Write­Line(a.Vypis(jme­no, vek, heslo))
Console.ReadKey()
End Sub

End Module

Public Class Uzivatel
Public jmeno As String
Public vek As Integer
Public heslo As String

Public Sub New(jmeno As String, vek As Integer, heslo As String)
Me.jmeno = jmeno
Me.vek = vek
Me.heslo = heslo
End Sub

Public Overrides Function ToString() As String
Return jmeno
Return vek
Return heslo
End Function
Public Function Vypis(jmeno, vek, heslo)
Return Me.jmeno
Return Me.vek
Return Me.heslo
End Function

End Class

 
Odpovědět 5. července 8:33
Avatar
David Hanina
Člen
Avatar
Odpovídá na Jaroslav Trojan
David Hanina:

Ahoj, je to způsobeno tím, že program funkci splní, ale jen do 1. returnu, to znamená, že když už něco navratí(return) tak dál nepokračuje. Šlo by to obejít tím, že by si navrátil pole, nebo by si nic nevracel ale rovnou vypisoval.

 
Odpovědět 5. července 9:17
Avatar
Jaroslav Trojan:

Již jsem to vyřešil změnou funkce ToString() a funce Vypis.
za Return jsem napsal [String].Format("{0} {1} {2}",jmeno,vek,hes­lo)
ostatní jsem vymazal, kód pracuje jak má

 
Odpovědět 8. července 12:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.