Objektově orientované programování (Visual Basic)
Visual Basic poskytuje plnou podporu objektově orientovaného programování, včetně zapouzdření, dědičnosti a polymorfismu.
Zapouzdření znamená, že skupina souvisejících vlastností, metod a dalších členů se považuje za jednu jednotku nebo objekt.
Dědičnost popisuje schopnost vytvářet nové třídy založené na existující třídě.
Polymorfismus znamená, že můžete mít více tříd, které lze zaměnitelně, i když každá třída implementuje stejné vlastnosti nebo metody různými způsoby.
Tato část popisuje následující koncepty:
Třídy a objekty
Termíny třídy a objekt jsou někdy zaměnitelně, ale ve skutečnosti třídy popisují typ objektů, zatímco objekty jsou použitelné instance tříd. Proto se akce vytvoření objektu nazývá vytvoření instance. Pomocí analogie podrobného plánu je třída podrobný plán a objekt je budova z daného podrobného plánu.
Definování třídy:
Class SampleClass
End Class
Visual Basic také poskytuje light verzi tříd označovaných jako struktury , které jsou užitečné, když potřebujete vytvořit velké pole objektů a nechcete pro to spotřebovávat příliš mnoho paměti.
Definování struktury:
Structure SampleStructure
End Structure
Další informace naleznete v tématu:
Členové třídy
Každá třída může mít různé členy třídy, které obsahují vlastnosti, které popisují data třídy, metody definující chování třídy a události, které poskytují komunikaci mezi různými třídami a objekty.
Vlastnosti a pole
Pole a vlastnosti představují informace, které objekt obsahuje. Pole jsou jako proměnné, protože je lze číst nebo nastavit přímo.
Definování pole:
Class SampleClass
Public SampleField As String
End Class
Vlastnosti mají procedury get a set, které poskytují větší kontrolu nad nastavením nebo vrácením hodnot.
Jazyk Visual Basic umožňuje buď vytvořit soukromé pole pro ukládání hodnoty vlastnosti, nebo použít automaticky implementované vlastnosti, které toto pole automaticky vytvoří na pozadí a poskytují základní logiku pro procedury vlastnosti.
Definování automaticky implementované vlastnosti:
Class SampleClass
Public Property SampleProperty as String
End Class
Pokud potřebujete provést některé další operace pro čtení a zápis hodnoty vlastnosti, definujte pole pro uložení hodnoty vlastnosti a zadejte základní logiku pro ukládání a načítání:
Class SampleClass
Private m_Sample As String
Public Property Sample() As String
Get
' Return the value stored in the field.
Return m_Sample
End Get
Set(ByVal Value As String)
' Store the value in the field.
m_Sample = Value
End Set
End Property
End Class
Většina vlastností má metody nebo postupy pro nastavení a získání hodnoty vlastnosti. Můžete ale vytvořit vlastnosti jen pro čtení nebo jen pro zápis, abyste jim zabránili v úpravě nebo čtení. V jazyce Visual Basic můžete používat ReadOnly
klíčová slova a WriteOnly
používat je. Automaticky implementované vlastnosti však nemohou být jen pro čtení nebo jen pro zápis.
Další informace naleznete v tématu:
Metody
Metoda je akce, kterou může objekt provést.
Poznámka:
V jazyce Visual Basic existují dva způsoby vytvoření metody: příkaz Sub
se používá, pokud metoda nevrací hodnotu; příkaz Function
se použije, pokud metoda vrátí hodnotu.
Definování metody třídy:
Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class
Třída může mít několik implementací nebo přetížení stejné metody, které se liší v počtu parametrů nebo typů parametrů.
Přetížení metody:
Overloads Sub Display(ByVal theChar As Char)
' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
' Add code that displays Integer data.
End Sub
Ve většině případů deklarujete metodu v rámci definice třídy. Visual Basic však také podporuje rozšiřující metody , které umožňují přidat metody do existující třídy mimo skutečnou definici třídy.
Další informace naleznete v tématu:
Konstruktory
Konstruktory jsou metody třídy, které se spouští automaticky při vytvoření objektu daného typu. Konstruktory obvykle inicializují datové členy nového objektu. Konstruktor lze spustit pouze jednou při vytvoření třídy. Kromě toho kód v konstruktoru vždy běží před jakýmkoli jiným kódem ve třídě. Můžete však vytvořit více přetížení konstruktoru stejným způsobem jako pro jakoukoli jinou metodu.
Definování konstruktoru pro třídu:
Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class
Další informace najdete v tématu: Životnost objektu: Způsob vytváření a zničení objektů.
Destruktory
Destruktory se používají k destrukci instancí tříd. V rozhraní .NET Framework systém uvolňování paměti automaticky spravuje přidělení a uvolnění paměti pro spravované objekty ve vaší aplikaci. K vyčištění nespravovaných prostředků, které vaše aplikace vytvoří, ale možná budete potřebovat destruktory. Pro třídu může existovat pouze jeden destruktor.
Další informace o destruktory a uvolňování paměti v rozhraní .NET Framework naleznete v tématu Uvolňování paměti.
Události
Události umožňují třídě nebo objektu upozorňovat jiné třídy nebo objekty, když dojde k nějakému zájmu. Třída, která odesílá (nebo vyvolává) událost se nazývá vydavatel a třídy, které přijímají (nebo zpracovávají) událost jsou volány odběrateli. Další informace o událostech, způsob jejich vyvolání a zpracování najdete v tématu Události.
K deklaraci událostí použijte příkaz události.
K vyvolání událostí použijte příkaz RaiseEvent.
Pokud chcete určit obslužné rutiny událostí pomocí deklarativního způsobu, použijte příkaz WithEvents a klauzuli Handles .
Chcete-li být schopni dynamicky přidávat, odebírat a měnit obslužnou rutinu události přidruženou k události, použijte Příkaz AddHandler a RemoveHandler Příkaz spolu s AddressOf Operator.
Vnořené třídy
Třída definovaná v jiné třídě se nazývá vnořená. Ve výchozím nastavení je vnořená třída soukromá.
Class Container
Class Nested
' Add code here.
End Class
End Class
Pokud chcete vytvořit instanci vnořené třídy, použijte název třídy kontejneru následovanou tečkou a potom název vnořené třídy:
Dim nestedInstance As Container.Nested = New Container.Nested()
Modifikátory přístupu a úrovně přístupu
Všechny třídy a členové třídy mohou určit, jakou úroveň přístupu poskytují jiným třídám pomocí modifikátorů přístupu.
K dispozici jsou následující modifikátory přístupu:
Modifikátor jazyka Visual Basic | Definice |
---|---|
Public | K typu nebo členu může přistupovat jakýkoli jiný kód ve stejném sestavení nebo jiném sestavení, které na něj odkazuje. |
Private | K typu nebo členu má přístup pouze kód ve stejné třídě. |
Protected | K typu nebo členu lze přistupovat pouze kódem ve stejné třídě nebo v odvozené třídě. |
Friend | K typu nebo členu může přistupovat jakýkoli kód ve stejném sestavení, ale ne z jiného sestavení. |
Protected Friend |
K typu nebo členu lze přistupovat libovolným kódem ve stejném sestavení nebo jakoukoli odvozenou třídou v jiném sestavení. |
Další informace naleznete v tématu Úrovně přístupu v jazyce Visual Basic.
Vytváření instancí tříd
Pokud chcete vytvořit objekt, musíte vytvořit instanci třídy nebo vytvořit instanci třídy.
Dim sampleObject as New SampleClass()
Po vytvoření instance třídy můžete přiřadit hodnoty k vlastnostem instance a polím a vyvolat metody třídy.
' Set a property value.
sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()
K přiřazení hodnot k vlastnostem během procesu vytváření instancí třídy použijte inicializátory objektů:
Dim sampleObject = New SampleClass With
{.FirstProperty = "A", .SecondProperty = "B"}
Další informace naleznete v tématu:
Sdílené třídy a členy
Sdílený člen třídy je vlastnost, procedura nebo pole sdílené všemi instancemi třídy.
Definování sdíleného člena:
Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Pokud chcete získat přístup ke sdílenému členu, použijte název třídy bez vytvoření objektu této třídy:
MsgBox(SampleClass.SampleString)
Sdílené moduly v jazyce Visual Basic mají pouze sdílené členy a nelze je vytvořit. Sdílené členy také nemají přístup k nesdílených vlastnostem, polím nebo metodám.
Další informace naleznete v tématu:
Anonymní typy
Anonymní typy umožňují vytvářet objekty bez zápisu definice třídy pro datový typ. Místo toho kompilátor vygeneruje třídu za vás. Třída nemá použitelný název a obsahuje vlastnosti, které zadáte při deklarování objektu.
Vytvoření instance anonymního typu:
' sampleObject is an instance of a simple anonymous type.
Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}
Další informace naleznete v tématu: Anonymní typy.
Dědičnost
Dědičnost umožňuje vytvořit novou třídu, která znovu používá, rozšiřuje a upravuje chování definované v jiné třídě. Třída, jejíž členy jsou zděděny, se nazývá základní třída a třída, která dědí tyto členy, se nazývá odvozená třída. Všechny třídy v jazyce Visual Basic však implicitně dědí z Object třídy, která podporuje hierarchii tříd .NET a poskytuje služby nízké úrovně pro všechny třídy.
Poznámka:
Visual Basic nepodporuje více dědičnosti. To znamená, že pro odvozenou třídu můžete zadat pouze jednu základní třídu.
Dědění ze základní třídy:
Class DerivedClass
Inherits BaseClass
End Class
Ve výchozím nastavení lze dědit všechny třídy. Můžete však určit, zda třída nesmí být použita jako základní třída, nebo vytvořit třídu, která se dá použít pouze jako základní třída.
Určení, že třídu nelze použít jako základní třídu:
NotInheritable Class SampleClass
End Class
Chcete-li určit, že třídu lze použít pouze jako základní třídu a nelze vytvořit instanci:
MustInherit Class BaseClass
End Class
Další informace naleznete v tématu:
Přepsání členů
Ve výchozím nastavení odvozená třída dědí všechny členy ze své základní třídy. Pokud chcete změnit chování zděděného člena, musíte ho přepsat. To znamená, že můžete definovat novou implementaci metody, vlastnosti nebo události v odvozené třídě.
K řízení způsobu přepsání vlastností a metod se používají následující modifikátory:
Modifikátor jazyka Visual Basic | Definice |
---|---|
Overridable | Umožňuje přepsání člena třídy v odvozené třídě. |
Overrides | Přepíše virtuální (přepisovatelný) člen definovaný v základní třídě. |
NotOverridable | Zabraňuje přepsání člena v zděděné třídě. |
MustOverride | Vyžaduje, aby byl člen třídy přepsán v odvozené třídě. |
Shadows | Skryje člen zděděný ze základní třídy. |
Rozhraní
Rozhraní, jako jsou třídy, definují sadu vlastností, metod a událostí. Na rozdíl od tříd však rozhraní neposkytují implementaci. Implementují se podle tříd a definují se jako samostatné entity od tříd. Rozhraní představuje kontrakt v tom, že třída, která implementuje rozhraní musí implementovat každý aspekt tohoto rozhraní přesně tak, jak je definován.
Definování rozhraní:
Public Interface ISampleInterface
Sub DoSomething()
End Interface
Implementace rozhraní ve třídě:
Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class
Další informace naleznete v tématu:
Obecné typy
Třídy, struktury, rozhraní a metody v .NET mohou obsahovat parametry typu, které definují typy objektů, které mohou ukládat nebo používat. Nejběžnějším příkladem obecných typů je kolekce, kde můžete určit typ objektů, které se mají uložit v kolekci.
Definování obecné třídy:
Class SampleGeneric(Of T)
Public Field As T
End Class
Vytvoření instance obecné třídy:
Dim sampleObject As New SampleGeneric(Of String)
sampleObject.Field = "Sample string"
Další informace naleznete v tématu:
Delegáti
Delegát je typ, který definuje podpis metody a může poskytnout odkaz na jakoukoli metodu s kompatibilním podpisem. Metodu můžete vyvolat (nebo volat) prostřednictvím delegáta. Delegáty se používají pro předávání metod jako argumentů jiným metodám.
Poznámka:
Ovladače událostí nejsou nic jiného než metody, které jsou vyvolány prostřednictvím delegátů. Další informace o používání delegátů při zpracování událostí najdete v tématu Události.
Vytvoření delegáta:
Delegate Sub SampleDelegate(ByVal str As String)
Vytvoření odkazu na metodu, která odpovídá podpisu určenému delegátem:
Class SampleClass
' Method that matches the SampleDelegate signature.
Sub SampleSub(ByVal str As String)
' Add code here.
End Sub
' Method that instantiates the delegate.
Sub SampleDelegateSub()
Dim sd As SampleDelegate = AddressOf SampleSub
sd("Sample string")
End Sub
End Class
Další informace naleznete v tématu: