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 Friendprywatne, 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 Onzmienna 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:

Object

  MarshalByRefObject

    Component

      Control

        ScrollableControl

          ContainerControl

            Form

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 nextFormelementu , 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 anyFormelementu . 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.

Zobacz też