Deklaracja zmiennej obiektu (Visual Basic)
Aby zadeklarować zmienną obiektu, należy użyć instrukcji deklaracji normalnej. Dla typu danych należy określić Object
(czyli typ danych obiektu) lub bardziej szczegółową klasę, z której ma zostać utworzony obiekt.
Deklarowanie zmiennej, która Object
jest taka sama jak deklarowanie jej jako System.Object.
Po zadeklarowaniu zmiennej z określoną klasą obiektu może ona uzyskać dostęp do wszystkich metod i właściwości uwidocznionych przez daną klasę i klasy, z których dziedziczy. Jeśli zadeklarujesz zmienną Objectza pomocą polecenia , będzie ona mogła uzyskiwać dostęp tylko do składowych Object klasy, chyba że włączysz Option Strict Off
późne powiązanie.
Składnia deklaracji
Użyj następującej składni, aby zadeklarować zmienną obiektu:
Dim variablename As [New] { objectclass | Object }
W deklaracji można również określić publiczne, chronione, znajome, Protected Friend
prywatne, udostępnione lub statyczne. Następujące przykładowe deklaracje są prawidłowe:
Private objA As Object
Static objB As System.Windows.Forms.Label
Dim objC As System.OperatingSystem
Późne wiązanie i wczesne wiązanie
Czasami określona klasa jest nieznana do momentu uruchomienia kodu. W takim przypadku należy zadeklarować zmienną obiektu z typem Object
danych. Spowoduje to utworzenie ogólnego odwołania do dowolnego typu obiektu, a określona klasa jest przypisywana w czasie wykonywania. Jest to nazywane późnym powiązaniem. Opóźnione powiązanie wymaga dodatkowego czasu wykonania. Ogranicza również kod do metod i właściwości klasy, do której został ostatnio przypisany. Może to spowodować błędy czasu wykonywania, jeśli kod próbuje uzyskać dostęp do elementów członkowskich innej klasy.
Gdy znasz konkretną klasę w czasie kompilacji, należy zadeklarować zmienną obiektu, która ma być tej klasy. Jest to nazywane wczesnym powiązaniem. Wczesne powiązanie poprawia wydajność i gwarantuje dostęp kodu do wszystkich metod i właściwości określonej klasy. W poprzednich przykładowych deklaracjach, jeśli zmienna objA
używa tylko obiektów klasy System.Windows.Forms.Label, należy określić As System.Windows.Forms.Label
w jego deklaracji.
Zalety wczesnego wiązania
Deklarowanie zmiennej obiektu jako konkretnej klasy daje kilka zalet:
Automatyczne sprawdzanie typów
Gwarantowany dostęp do wszystkich elementów członkowskich określonej klasy
Obsługa funkcji Microsoft IntelliSense w Edytorze kodu
Ulepszona czytelność kodu
Mniej błędów w kodzie
Błędy przechwycone w czasie kompilacji, a nie w czasie wykonywania
Szybsze wykonywanie kodu
Dostęp do składowych zmiennych obiektów
Po Option Strict
włączeniu On
zmienna obiektu może uzyskiwać dostęp tylko do metod i właściwości klasy, za pomocą której ją deklarujesz. Ilustruje to poniższy przykład.
' 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
W tym przykładzie p
można użyć tylko składowych Object samej klasy, które nie zawierają Left
właściwości . Z drugiej strony q
został zadeklarowany jako typ Label, więc może używać wszystkich metod i właściwości Label klasy w System.Windows.Forms przestrzeni nazw.
Elastyczność zmiennych obiektu
Podczas pracy z obiektami w hierarchii dziedziczenia można wybrać klasę, która ma być używana do deklarowania zmiennych obiektów. W ten sposób należy zrównoważyć elastyczność przypisywania obiektów względem dostępu do składowych klasy. Rozważmy na przykład hierarchię System.Windows.Forms.Form dziedziczenia, która prowadzi do klasy:
Załóżmy, że aplikacja definiuje klasę formularza o nazwie specialForm
, która dziedziczy z klasy Form. Można zadeklarować zmienną obiektu, która odnosi się konkretnie do specialForm
, jak pokazano w poniższym przykładzie.
Public Class specialForm
Inherits System.Windows.Forms.Form
' Insert code defining methods and properties of specialForm.
End Class
Dim nextForm As New specialForm
Deklaracja w poprzednim przykładzie ogranicza zmienną nextForm
do obiektów klasy specialForm
, ale także udostępnia wszystkie metody i właściwości specialForm
dostępne dla nextForm
elementu , a także wszystkie elementy członkowskie wszystkich klas, z których specialForm
dziedziczy.
Aby zmienna obiektu była bardziej ogólna, deklarując ją jako typ Form, jak pokazano w poniższym przykładzie.
Dim anyForm As System.Windows.Forms.Form
Deklaracja w poprzednim przykładzie umożliwia przypisanie dowolnego formularza w aplikacji do anyForm
elementu . Jednak mimo anyForm
że może uzyskać dostęp do wszystkich składowych klasy Form, nie może używać żadnych dodatkowych metod lub właściwości zdefiniowanych dla określonych formularzy, takich jak specialForm
.
Wszystkie elementy członkowskie klasy bazowej są dostępne dla klas pochodnych, ale dodatkowe elementy członkowskie klasy pochodnej są niedostępne dla klasy bazowej.