Deklarace proměnné objektu (Visual Basic)
K deklaraci proměnné objektu použijete příkaz normální deklarace. Pro datový typ zadáte buď Object
(tj. datový typ objektu), nebo konkrétnější třídu, ze které se má objekt vytvořit.
Deklarování proměnné jako Object
je stejné jako deklarování proměnné jako System.Object.
Když deklarujete proměnnou s konkrétní třídou objektu, bude mít přístup ke všem metodám a vlastnostem vystaveným danou třídou a třídám, ze kterých dědí. Pokud proměnnou deklarujete pomocí Object, bude mít přístup pouze ke členům Object třídy, pokud se nerozhodnete Option Strict Off
povolit pozdní vazbu.
Syntaxe deklarace
Pomocí následující syntaxe deklarujte proměnnou objektu:
Dim variablename As [New] { objectclass | Object }
V deklaraci můžete také zadat veřejné, chráněné, přítel, Protected Friend
, soukromé, sdílené nebo statické. Následující ukázkové deklarace jsou platné:
Private objA As Object
Static objB As System.Windows.Forms.Label
Dim objC As System.OperatingSystem
Pozdní vazby a časná vazba
Někdy je konkrétní třída neznámá, dokud se váš kód nespustí. V tomto případě musíte deklarovat proměnnou objektu s datovým typem Object
. Tím se vytvoří obecný odkaz na jakýkoli typ objektu a konkrétní třída je přiřazena za běhu. Tomu se říká pozdní vazba. Pozdní vazba vyžaduje další dobu provádění. Omezuje také kód na metody a vlastnosti třídy, kterou jste k ní nedávno přiřadili. To může způsobit chyby za běhu, pokud se váš kód pokusí o přístup k členům jiné třídy.
Pokud znáte konkrétní třídu v době kompilace, měli byste deklarovat proměnnou objektu, která má být z této třídy. Tomu se říká časná vazba. Časná vazba zlepšuje výkon a zaručuje přístup kódu ke všem metodám a vlastnostem konkrétní třídy. V předchozím příkladu deklarace, pokud proměnná objA
používá pouze objekty třídy System.Windows.Forms.Label, byste měli zadat As System.Windows.Forms.Label
v jeho deklaraci.
Výhody včasné vazby
Deklarace proměnné objektu jako konkrétní třídy poskytuje několik výhod:
Automatická kontrola typů
Garantovaný přístup ke všem členům konkrétní třídy
Podpora Technologie Microsoft IntelliSense v Editoru kódu
Lepší čitelnost kódu
Méně chyb v kódu
Chyby zachycené v době kompilace místo doby běhu
Rychlejší spouštění kódu
Přístup k členům proměnných objektů
Při Option Strict
odevzdání On
může proměnná objektu přistupovat pouze k metodám a vlastnostem třídy, se kterou ji deklarujete. Toto dokládá následující příklad.
' Option statements must precede all other source file lines.
Option Strict On
' Imports statement must precede all declarations in the source file.
Imports System.Windows.Forms
Public Sub accessMembers()
Dim p As Object
Dim q As System.Windows.Forms.Label
p = New System.Windows.Forms.Label
q = New System.Windows.Forms.Label
Dim j, k As Integer
' The following statement generates a compiler ERROR.
j = p.Left
' The following statement retrieves the left edge of the label in pixels.
k = q.Left
End Sub
V tomto příkladu p
lze použít pouze členy Object samotné třídy, které nezahrnují Left
vlastnost. Na druhou stranu byl q
deklarován jako typ Label, takže může používat všechny metody a vlastnosti Label třídy v System.Windows.Forms oboru názvů.
Flexibilita proměnných objektů
Při práci s objekty v hierarchii dědičnosti máte na výběr, kterou třídu použít k deklarování proměnných objektu. Při této volbě musíte vyvážit flexibilitu přiřazování objektů proti přístupu k členům třídy. Představte si například hierarchii dědičnosti, která vede ke System.Windows.Forms.Form třídě:
Předpokládejme, že vaše aplikace definuje třídu formuláře s názvem specialForm
, která dědí z třídy Form. Můžete deklarovat proměnnou objektu, která odkazuje konkrétně na specialForm
, jak ukazuje následující příklad.
Public Class specialForm
Inherits System.Windows.Forms.Form
' Insert code defining methods and properties of specialForm.
End Class
Dim nextForm As New specialForm
Deklarace v předchozím příkladu omezuje proměnnou nextForm
na objekty třídy specialForm
, ale také zpřístupňuje nextForm
všechny metody a vlastnosti specialForm
, stejně jako všechny členy všech tříd, ze kterých specialForm
dědí.
Proměnnou objektu můžete obecněji deklarovat tak, že ji deklarujete jako typ Form, jak ukazuje následující příklad.
Dim anyForm As System.Windows.Forms.Form
Deklarace v předchozím příkladu umožňuje přiřadit libovolný formulář v aplikaci .anyForm
Ačkoli však anyForm
může přistupovat ke všem členům třídy Form, nemůže použít žádné z dalších metod nebo vlastností definovaných pro konkrétní formuláře, například specialForm
.
Pro odvozené třídy jsou k dispozici všechny členy základní třídy, ale další členy odvozené třídy nejsou pro základní třídu k dispozici.