Objekte und Klassen in Visual Basic

Ein Objekt ist eine Kombination aus Code und Daten, die als Einheit behandelt werden kann. Ein Objekt kann ein Teil einer Anwendung sein wie ein Steuerelement oder ein Formular. Eine vollständige Anwendung kann auch ein Objekt sein.

Beim Erstellen einer Anwendung in Visual Basic arbeiten Sie stets mit Objekten. Sie können Objekte verwenden, die von Visual Basic bereitgestellt wurden, z. B. Steuerelemente, Formulare und Datenzugriffsobjekte. Sie können auch Objekte aus anderen Anwendungen in Ihrer Visual Basic-Anwendung verwenden. Sie können sogar eigene Objekte erstellen und für diese zusätzliche Eigenschaften und Methoden definieren. Objekte verhalten sich wie vorgefertigte Bausteine für Programme – Sie können ein Stück Code einmal schreiben und immer wieder verwenden.

Dieses Thema beschreibt Objekte im Detail.

Objekte und Klassen

Jedes Objekt in Visual Basic wird durch eine Klasse definiert. Eine Klasse beschreibt die Variablen, Eigenschaften, Prozeduren und Ereignisse eines Objekts. Objekte sind Instanzen von Klassen. Sie können beliebig viele Objekte erstellen, die Sie benötigen, sobald Sie eine Klasse definiert haben.

Um die Beziehung zwischen einem Objekt und seiner Klasse zu verstehen, stellen Sie sich Ausstechformen und Kekse vor. Die Ausstechform ist die Klasse. Sie definiert die Merkmale der einzelnen Kekse, z.B. die Größe und Form. Die Klasse wird verwendet, um Objekte zu erstellen. Die Objekte sind die Kekse.

Sie müssen ein Objekt erstellen, bevor Sie auf seine Member zugreifen können, mit Ausnahme von Shared-Membern, auf die ohne ein Objekt der Klasse zugegriffen werden kann.

Erstellen eines Objekts aus einer Klasse

  1. Bestimmen Sie, aus welcher Klasse Sie ein Objekt erstellen möchten, oder definieren Sie Ihre eigene Klasse. Zum Beispiel:

    Public Class Customer
        Public Property AccountNumber As Integer
    End Class
    
  2. Schreiben Sie eine Dim-Anweisung, um eine Variable zu erstellen, der Sie eine Klasseninstanz zuweisen können. Die Variable sollte vom Typ der gewünschten Klasse sein.

    Dim nextCustomer As Customer
    
  3. Fügen Sie das Schlüsselwort Neuer Operator hinzu, um die Variable für eine neue Instanz der Klasse zu initialisieren.

    Dim nextCustomer As New Customer
    
  4. Sie können jetzt die Member der Klasse über die Objektvariable aufrufen.

    nextCustomer.AccountNumber = lastAccountNumber + 1
    

Hinweis

Sie sollten die Variable möglichst so deklarieren, dass sie den Klassentyp aufweist, den Sie ihr zuweisen möchten. Dies wird als frühe Bindung bezeichnet. Wenn Sie den Klassentyp zur Kompilierungszeit nicht kennen, können Sie Späte Bindung aufrufen, indem Sie für die Variable den Objekt-Datentyp deklarieren. Allerdings kann die späte Bindung zu Leistungseinbußen und Einschränkungen des Zugriffs auf die Member des Laufzeitobjekts führen. Weitere Informationen finden Sie unter Object Variable Declaration.

Mehrere Instanzen

Neu erstellte Objekte aus einer Klasse sind häufig identisch. Sobald sie als einzelne Objekte vorhanden sind, können jedoch ihre Variablen und Eigenschaften unabhängig von den anderen Instanzen geändert werden. Beispiel: Wenn Sie drei Kontrollkästchen zu einem Formular hinzufügen, ist jedes Kontrollkästchenobjekt eine Instanz der Klasse CheckBox. Die einzelnen CheckBox-Objekte verfügen über einen gemeinsamen Satz von Merkmalen und Funktionen (Eigenschaften, Variablen, Prozeduren und Ereignisse), die anhand der Klasse definiert sind. Alle verfügen jedoch über einen eigenen Namen, können separat aktiviert und deaktiviert sowie an einer anderen Stelle im Formular platziert werden.

Objektmember

Ein Objekt ist ein Element einer Anwendung, das eine Instanz einer Klasse darstellt. Felder, Eigenschaften, Methoden und Ereignisse sind die Bausteine von Objekten und bilden ihre Member.

Memberzugriff

Sie greifen auf einen Member eines Objekts zu, indem Sie nacheinander den Namen der Objektvariablen, einen Zeitraum (.) und den Namen des Members angeben. Im folgenden Beispiel wird die Text-Eigenschaft eines Label-Objekts festgelegt.

warningLabel.Text = "Data not saved"

IntelliSense-Auflistung von Membern

IntelliSense listet die Member einer Klasse auf, wenn Sie die Option „Member auflisten“ aufrufen, beispielsweise wenn Sie einen Punkt (.) als Memberzugriffsoperator eingeben. Wenn Sie den Punkt nach dem Namen einer Variablen eingeben, die als Instanz dieser Klasse deklariert war, listet IntelliSense alle Instanzmember und keinen der freigegebenen Member auf. Wenn Sie den Punkt nach dem Klassennamen selbst eingeben, listet IntelliSense alle freigegebenen Member und keinen der Instanzmember auf. Weitere Informationen finden Sie unter Verwenden von IntelliSense.

Felder und Eigenschaften

Felder und Eigenschaften stellen die in einem Objekt enthaltenen Informationen dar. Sie rufen ihre Werte ab und legen diese mit Zuweisungsanweisungen ebenso fest, wie Sie lokale Variablen in einer Prozedur abrufen und festlegen. Das folgende Beispiel ruft die Width-Eigenschaft ab und legt die ForeColor-Eigenschaft eines Label-Objekts fest.

Dim warningWidth As Integer = warningLabel.Width
warningLabel.ForeColor = System.Drawing.Color.Red

Beachten Sie, dass ein Feld auch als Membervariable bezeichnet wird.

Verwenden Sie Eigenschaftenprozeduren in folgenden Fällen:

  • Sie müssen steuern, wann und wie ein Wert festgelegt oder abgerufen wird.

  • Die Eigenschaft weist einen genau definierten Satz von Werten auf, die überprüft werden müssen.

  • Das Festlegen des Werts führt zu einer wahrnehmbaren Änderung am Zustand des Objekts, z.B. einer IsVisible-Eigenschaft.

  • Das Festlegen der Eigenschaft führt zu Änderungen an anderen internen Variablen oder den Werten anderer Eigenschaften.

  • Eine Reihe von Schritten muss ausgeführt werden, bevor die Eigenschaft festgelegt oder abgerufen werden kann.

Verwenden Sie Felder in folgenden Fällen:

  • Der Wert ist der eines sich selbst überprüfenden Typs. Beispiel: Ein Fehler oder die automatische Datenkonvertierung erfolgt, wenn ein anderer Wert als True oder False einer Boolean-Variable zugewiesen wird.

  • Jeder Wert im vom Datentyp unterstützten Bereich ist ungültig. Dies gilt für zahlreiche Eigenschaften vom Typ Single oder Double.

  • Die Eigenschaft ist ein String-Datentyp, und es gibt keine Einschränkung für die Größe oder den Wert der Zeichenfolge.

  • Weitere Informationen finden Sie unter Property Procedures (Eigenschaftenprozeduren).

Tipp

Lassen Sie die nicht konstanten Felder immer privat. Wenn Sie sie öffentlich machen möchten, verwenden Sie stattdessen eine Eigenschaft.

Methoden

Eine Methode ist eine Aktion, die von einem Objekt ausgeführt werden kann. Beispielsweise ist Add eine Methode des ComboBox-Objekts, die einen neuen Eintrag zu einem Kombinationsfeld hinzufügt.

Im folgenden Beispiel wird die Verwendung der Start-Methode eines Timer-Objekts gezeigt.

Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()

Beachten Sie, dass eine Methode einfach eine Prozedur ist, die von einem Objekt zur Verfügung gestellt wird.

Weitere Informationen finden Sie unter Prozeduren.

Ereignisse

Ein Ereignis ist eine Aktion, die von einem Objekt erkannt wird, etwa durch Klicken mit der Maus oder Drücken einer Taste, und für die Sie Code als Reaktion verfassen können. Ereignisse können als Ergebnis einer Benutzeraktion oder von Programmcode auftreten bzw. vom System verursacht werden. Code, der ein Ereignis signalisiert, soll das Ereignis auslösen, und Code, der darauf antwortet, soll es abwickeln.

Sie können auch eigene, benutzerdefinierte Ereignisse entwickeln, die von Ihren Objekten ausgelöst und von anderen Objekten abgewickelt werden sollen. Weitere Informationen finden Sie unter Ereignisse.

Instanzmember und freigegebene Member

Wenn Sie ein Objekt aus einer Klasse erstellen, ist das Ergebnis eine Instanz dieser Klasse. Member, die nicht mit dem Schlüsselwort Freigegeben deklariert werden, sind Instanzmember, die ausschließlich zu dieser betreffenden Instanz gehören. Ein Instanzmember in einer Instanz ist unabhängig vom gleichen Member in einer anderen Instanz derselben Klasse. Eine Instanzmembervariable kann beispielsweise unterschiedliche Werte in verschiedenen Instanzen aufweisen.

Elemente, die mit dem Schlüsselwort Shared deklariert werden, sind freigegebene Member, die zu einer Klasse als Ganzes und nicht zu einer bestimmten Instanz gehören. Ein freigegebener Member ist nur einmal vorhanden, unabhängig davon, wie viele Instanzen seiner Klasse Sie erstellen oder ob Sie keine Instanzen erstellen. Eine Variable für einen freigegebenen Member enthält beispielsweise nur einen Wert, der für den gesamten Code zur Verfügung steht, der auf die Klasse zugreifen kann.

Zugreifen auf nicht freigegebene Member

  1. Stellen Sie sicher, dass das Objekt aus seiner Klasse erstellt und einer Objektvariablen zugewiesen wurde.

    Dim secondForm As New System.Windows.Forms.Form
    
  2. Führen Sie in der Anweisung, die auf den Member zugreift, den Namen der Objektvariablen mit dem Memberzugriffsoperator (.) und dann dem Membernamen an.

    secondForm.Show()
    

Zugreifen auf freigegebene Member

  • Führen Sie den Klassennamen mit dem Memberzugriffsoperator (.) und dann den Membernamen an. Sie sollten einen Shared-Member des Objekts immer direkt über den Klassennamen aufrufen.

    Console.WriteLine("This computer is called " & Environment.MachineName)
    
  • Wenn Sie bereits ein Objekt aus der Klasse erstellt haben, können Sie alternativ einen Shared-Member über die Variable des Objekts aufrufen.

Unterschiede zwischen Klassen und Modulen

Der Hauptunterschied zwischen Klassen und Modulen besteht darin, dass Klassen als Objekte instanziiert werden können, während dies für Standardmodule nicht möglich ist. Da nur eine Kopie der Daten eines Standardmoduls vorhanden ist, wenn ein Teil Ihres Programms eine öffentliche Variable in einem Standardmodul ändert, erhält jeder andere Teil des Programms denselben Wert, wenn er diese Variable anschließend liest. Im Gegensatz dazu sind Objektdaten für jedes instanziierte Objekt separat vorhanden. Ein weiterer Unterschied ist, dass Klassen im Gegensatz zu Standardmodulen Schnittstellen implementieren können. Wenn eine Klasse mit dem MustInherit-Modifizierer gekennzeichnet ist, kann sie nicht direkt instanziiert werden. Es besteht jedoch immer noch ein Unterschied zu einem Modul, da sie geerbt werden kann, während Module nicht geerbt werden können.

Hinweis

Wenn der Shared-Modifizierer auf einen Klassenmember angewendet wird, wird er der Klasse selbst statt einer bestimmten Instanz der Klasse zugeordnet. Der Member wird direkt mithilfe des Klassennamens aufgerufen, und zwar auf dieselbe Weise wie Modulmember.

Klassen und Module verwenden auch verschiedene Geltungsbereiche für ihre Mitglieder. Member, die innerhalb einer Klasse definiert sind, sind auf eine bestimmte Instanz der Klasse beschränkt und nur für die Lebensdauer des Objekts vorhanden. Zum Zugriff auf Member der Klasse von außerhalb einer Klasse müssen Sie vollqualifizierte Namen im Format Objekt.Member verwenden.

Andererseits können die in einem Modul deklarierten Member standardmäßig öffentlich und mit jedem beliebigen Code aufgerufen werden, mit dem das Modul aufgerufen werden kann. Das bedeutet, dass Variablen in einem Standardmodul letztendlich globale Variablen sind, da sie an jeder beliebigen Stelle im Projekt sichtbar sind und für die Lebensdauer des Programms vorhanden sind.

Wiederverwenden von Klassen und Objekten

Mit Objekten können Sie Variablen und Prozeduren einmal deklarieren und anschließend bei Bedarf jederzeit wiederverwenden. Beispiel: Wenn Sie einer Anwendung eine Rechtschreibprüfung hinzufügen möchten, können Sie sämtliche Variablen und Supportfunktionen definieren, um die Rechtschreibprüfungsfunktion bereitzustellen. Wenn Sie Ihre Rechtschreibprüfung als Klasse erstellen, können Sie sie anschließend in anderen Anwendungen wiederverwenden, indem Sie einen Verweis auf die kompilierte Assembly hinzufügen. Sie können sich möglicherweise sogar selbst etwas Arbeit sparen, indem Sie eine Rechtschreibprüfungsklasse verwenden, die bereits von jemand anderem entwickelt wurde.

.NET bietet viele Beispiele von Komponenten, die zur Verwendung verfügbar sind. Das folgende Beispiel verwendet die TimeZone-Klasse im System-Namespace. TimeZone enthält Member, die Ihnen das Abrufen von Informationen über die Zeitzone des aktuellen Computersystems ermöglichen.

Public Sub ExamineTimeZone()
    Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone
    Dim s As String = "Current time zone is "
    s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "
    s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "
    s &= "different from UTC (coordinated universal time)"
    s &= vbCrLf & "and is currently "
    If tz.IsDaylightSavingTime(Now) = False Then s &= "not "
    s &= "on ""summer time""."
    Console.WriteLine(s)
End Sub

Im vorherigen Beispiel deklariert die erste Dim-Anweisung eine Objektvariable des Typs TimeZone und weist sie einem TimeZone-Objekt hinzu, das von der CurrentTimeZone-Eigenschaft zurückgegeben wurde.

Beziehungen zwischen Objekten

Objekte können auf verschiedene Weisen miteinander verknüpft werden. Die grundsätzlichen Arten von Beziehungen sind Hierarchisch und Einschluss.

Hierarchische Beziehung

Wenn Klassen von grundlegenderen Klassen abgeleitet werden, wird von einer hierarchischen Beziehung gesprochen. Klassenhierarchien sind nützlich, wenn Elemente beschrieben werden, die einen Untertyp einer allgemeineren Klasse darstellen.

Im folgenden Beispiel nehmen wir an, Sie möchten eine besondere Art eines Button-Elements definieren, das wie ein normales Button-Element agiert, aber auch eine Methode zur Verfügung stellt, die die Vordergrund- und Hintergrundfarben umkehrt.

Definieren einer Klasse, die von einer bereits vorhandenen Klasse abgeleitet wird

  1. Verwenden Sie eine Class-Anweisung zur Definition einer Klasse, aus der das benötigte Objekt erstellt werden soll.

    Public Class ReversibleButton
    

    Achten Sie darauf, dass der letzten Codezeile in der Klasse eine End Class-Anweisung folgt. Standardmäßig generiert die integrierte Entwicklungsumgebung (Integrated Development Environment, IDE) bei der Eingabe einer Class-Anweisung automatisch ein End Class-Element.

  2. Der Class-Anweisung muss sofort eine Inherits-Anweisung folgen. Geben Sie die Klasse an, von der Ihre neue Klasse abgeleitet wird.

    Inherits System.Windows.Forms.Button
    

    Ihre neue Klasse erbt alle Member, die von der Basisklasse definiert wurden.

  3. Fügen Sie den Code für die zusätzlichen Member hinzu, die Ihre abgeleitete Klasse zur Verfügung stellt. Sie können z.B. eine ReverseColors-Methode hinzufügen, und die abgeleitete Klasse könnte wie folgt aussehen:

    Public Class ReversibleButton
        Inherits System.Windows.Forms.Button
            Public Sub ReverseColors()
                Dim saveColor As System.Drawing.Color = Me.BackColor
                Me.BackColor = Me.ForeColor
                Me.ForeColor = saveColor
           End Sub
    End Class
    

    Falls Sie ein Objekt aus der ReversibleButton-Klasse erstellen, kann diese auf alle Member der Button-Klasse sowie auf die ReverseColors-Methode und sämtliche anderen neuen Member zugreifen, die Sie in ReversibleButton definieren.

Abgeleitete Klassen erben Member aus der Klasse, auf der sie basieren. So können Sie die Komplexität beim Vordringen in einer Klassenhierarchie steigern. Weitere Informationen finden Sie unter Grundlagen der Vererbung.

Kompilieren des Codes

Achten Sie darauf, dass der Compiler die Klasse aufrufen kann, von der Ihre neue Klasse abgeleitet werden soll. Dies kann das vollständige Qualifizieren des Namens beinhalten, wie im vorherigen Beispiel, oder das Identifizieren des Namespace in einer Imports-Anweisung (.NET Namespace und Typ). Wenn sich die Klasse in einem anderen Projekt befindet, müssen Sie möglicherweise einen Verweis auf das Projekt hinzufügen. Weitere Informationen finden Sie unter Verwalten von Verweisen in einem Projekt.

Einschlussbeziehung

Eine andere Möglichkeit zur Verknüpfung von Objekten ist eine Einschlussbeziehung. Containerobjekte schließen andere Objekte logisch ein. Beispielsweise enthält das OperatingSystem-Objekt ein Version-Objekt logisch, das es durch seine Version-Eigenschaft zurückgibt. Beachten Sie, dass das Container-Objekt physisch kein anderes Objekt enthält.

Sammlungen

Ein bestimmter Typ des Objekteinschlusses wird dargestellt durch Auflistungen. Auflistungen sind Gruppen ähnlicher Objekte, die aufgelistet werden können. Visual Basic unterstützt eine spezifische Syntax in der For Each...Next-Anweisung, in der Sie die Elemente einer Auflistung durchlaufen können. Zudem ermöglichen Auflistungen die Verwendung eines Item[]-Elements zum Abrufen von Elementen anhand ihres Indexes oder anhand der Zuordnung zu einer eindeutigen Zeichenfolge. Auflistungen können einfacher verwendet werden als Arrays, denn Sie können sie zum Hinzufügen oder Entfernen von Elementen ohne Indizes verwenden. Aufgrund ihrer Benutzerfreundlichkeit werden Auflistungen häufig zum Speichern von Formularen und Steuerelementen verwendet.

Exemplarische Vorgehensweise: Definieren von Klassen
Stellt eine schrittweise Beschreibung des Erstellens einer Klasse bereit.

Überladene Eigenschaften und Methoden
Überladene Eigenschaften und Methoden

Grundlagen der Vererbung
Beschreibt die Vererbungsmodifizierer, das Außerkraftsetzen von Methoden und Eigenschaften, MyClass und MyBase.

Objektlebensdauer: Erstellen und Zerstören von Objekten
Erläutert das Erstellen und Entfernen von Klasseninstanzen.

Anonyme Typen
Beschreibt das Erstellen und Verwenden von anonymen Typen, die Ihnen das Erstellen von Objekten ermöglichen, ohne eine Klassendefinition für den Datentyp zu schreiben.

Objektinitialisierer: benannte und anonyme Typen
Erläutert Objektinitialisierer, die zum Erstellen von Instanzen von benannten und anonymen Typen mit einem einzelnen Ausdruck verwendet werden.

Vorgehensweise: Ableiten von Eigenschaftennamen und Typen in Deklarationen von anonymen Typen
Erklärt das Ableiten von Eigenschaftennamen und Typen in Deklarationen von anonymen Typen. Stellt Beispiele für erfolgreiche und fehlgeschlagene Ableitungen bereit.