Visual Basic: Mit Klassen programmieren

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Visual Basic: Mit Klassen programmieren

Wer bisher mit VBA oder C# gearbeitet hat und zu VB wechseln möchte, sieht sich bei der Entwicklung von WPF-Anwendungen einigen Änderungen gegenüber. Dieser Artikel liefert die Grundlagen zum Umgang mit Namespaces und zur Programmierung von Klassen. Zum Experimentieren mit den Beispielen nutzen wir das Tool LINQPad 5.

Klassen

Im Gegensatz zu C# werden Klassen unter Visual Basic nicht durch eine geschweifte Klammer eingeleitet und beendet, sondern wir arbeiten mit dem für Visual Basis typischen Start- und Endzeilen:

Class Beispiel
     ---
End Class

Class-Elemente können dabei mit folgenden Modifizierern ausgestattet werden:

  • Public: Die Klasse ist innerhalb der Assembly und auch von anderen Assemblies aus sichtbar.
  • Friend: Die Klasse ist nur innerhalb der Assembly sichtbar, zu der sie gehört. Dies ist der Standard-Modifizierer, wenn Sie dem Schlüsselwort Class weder Public noch Friend oder einen anderen Modifizierer voranstellen!

Klasse erstellen

Eine Klasse wird typischerweise in einer eigenen Code-Datei angelegt. Wenn Sie ein neues WPF-Fenster anlegen, fügt Visual Studio beispielsweise eine eigene Datei mit der Dateiendung .xaml.vb hinzu, welche als Code behind-Modul für das WPF-Fenster dient. Wenn Sie eine neue Klasse benötigen, die nicht als Code behind-Modul für ein WPF-Element dient, erledigen Sie dies normalerweise über den Dialog Neues Element hinzufügen..., den Sie am einfachsten durch Markieren des Projekts im Projektmappen-Explorer und anschließendes Betätigen der Tastenkombination Strg + Umschalt + A aufrufen.

Hier wählen Sie dann den Eintrag Klasse aus und geben den gewünschten Namen an, in diesem Fall Beispiel (siehe Bild 1).

Einfügen einer neuen Klassendatei

Bild 1: Einfügen einer neuen Klassendatei

Die neue Klasse wird dann mit dem Public-Schlüsselwort ausgezeichnet. Wenn Sie nicht wollen, dass die Klasse in anderen Assemblies genutzt werden kann, ändern Sie Public also in Friend:

Public Class Beispiel
End Class

Objekte auf Basis von Klassen initialisieren

Es gibt verschiedene Arten, eine Klasse zu initialisieren. Wenn Sie den Zeitpunkt der Deklaration und der Initialisierung trennen möchten, nutzen Sie zwei Anweisungen:

Dim Beispielklasse As Beispiel
Beispielklasse = New Beispiel

Anderenfalls haben Sie die Wahl zwischen den folgenden beiden Schreibweisen. Die erste kennen Sie von VBA:

Dim Beispielklasse As New Beispiel

Die zweite ist eine Kombination aus dem Zweizeiler:

Dim Beispielklasse As Beispiel = New Beispiel

Weitere Klassen anlegen

Wenn Sie weitere Klassen anlegen wollen, haben Sie die Wahl: Sie können jeweils eine neue Datei mit jeder Klasse erstellen, was wie oben beschrieben funktioniert. Theoretisch können Sie aber auch mehrere Klassen in einer Datei speichern. Sie können neue Klassen auch innerhalb bestehender Klassen anlegen. Das sieht dann etwa wie folgt aus:

Public Class Beispiel
     Public Class UntergeordneteKlasse
     End Class
End Class

Mit Klassen experimentieren

Die schönste Benutzeroberfläche auch zum Experimentieren mit Klassen ist das Tool LINQPad. Damit können Sie, was für die Beispiele dieses Artikels sinnvoll ist, unter Language den Eintrag VB Program auswählen. Es wird dann automatisch eine Sub Main eingerichtet, unterhalb derer Sie die Klassen dieses Artikels definieren können. In Sub Main greifen Sie dann ganz einfach auf die Klassen zu (siehe Bild 2). Wenn Sie auf die Start-Schaltfläche klicken, wird Sub Main ausgeführt. Wir fügen der untergeordneten Klasse einfach eine öffentliche Eigenschaft hinzu:

Experimentieren mit Klassen in LINQPad

Bild 2: Experimentieren mit Klassen in LINQPad

Public Class Beispiel
     Public Class UntergeordneteKlasse
         Public Property Test As String = "bla"
     End Class
End Class

Die untergeordnete Klasse können Sie etwa wie folgt deklarieren und initialisieren:

Dim UntergeordneteKlasse As Beispiel.UntergeordneteKlasse
UntergeordneteKlasse = New Beispiel.UntergeordneteKlasse
Debug.WriteLine (UntergeordneteKlasse.Test)

Für solche untergeordneten Klassen gibt es neben den Modifizierern Public und Friend noch drei weitere mögliche Modifizierer. Diese Modifizierer gelten natürlich auch für die anderen Elemente einer Klasse, also beispielsweise Methoden, Eigenschaften oder Ereignisse:

  • Private: Die Klassen, Methoden, Ereignisse und Eigenschaften können nur innerhalb des Objekts genutzt werden, in der diese auch definiert wurde. Außerhalb der übergeordneten Klasse ist sie nicht sichtbar. Wenn Sie die Klasse UntergeordneteKlasse von oben als Private deklarieren würden, könnten Sie nicht von der Methode Public Main darauf zugreifen.
  • Protected: Die Klasse, Methoden, Ereignisse und Eigenschaften können nur innerhalb des Objekts genutzt werden, indem diese definiert wurden, und in Objekten auf Basis von Klassen, die von der ursprünglichen Klasse abgeleitet sind. Ableitungen von Klassen stellen wir später noch vor.
  • Protected Friend: Die Klasse, Methoden, Ereignisse und Eigenschaften können nur innerhalb des Objekts und der Assembly genutzt werden, indem diese definiert wurden, und in Objekten auf Basis von Klassen, die von der ursprünglichen Klasse abgeleitet sind.

Felder von Klassen

Sie können einer Klasse sogenannte Felder hinzufügen, indem Sie direkt unterhalb der Class-Ebene Variablen deklarieren. Dies können Variablen mit dem Modifizierer Public, Private oder einem der anderen Modifizierer sein. Public-Felder können Sie auch von außerhalb lesen und schreiben. Die Klasse im folgenden Beispiel hat eine öffentliche und eine private Variable. Die öffentliche ist von außen per IntelliSense verfügbar und kann sowohl geschrieben als auch abgefragt werden:

Sub Main
     Dim KlasseMitFeld As KlasseMitFeld
     KlasseMitFeld = New KlasseMitFeld
     KlasseMitFeld.Zeichenkette = "Test"
     Debug.WriteLine(KlasseMitFeld.Zeichenkette)
End Sub
Public Class KlasseMitFeld
     Public Zeichenkette As String 
     Private Zahl As Integer
End Class

Felder als nur lesbar markieren

Wenn ein Feld nur lesenden, aber keinen schreibenden Zugriff ermöglichen soll, deklarieren Sie es mit dem Schlüsselwort ReadOnly:

Public ReadOnly ZeichenketteNurLesbar As String

Diese liefert dann beim Zugriff von außen den Wert null zurück. Schreibend können Sie von außen nicht auf dieses Feld zugreifen, und von innerhalb der Klasse, in der es definiert ist, auch nur sehr eingeschränkt. Sie können es in der Deklarationszeile mit dem gewünschten Wert initialisieren:

Public ReadOnly ZeichenketteNurLesbar As String = "Nur lesbar"

Die Konstruktor-Methode

Die einzige weitere Alternative bei schreibgeschützten Feldern ist die Verwendung der Konstruktor-Methode. Also schauen wir uns diese gleich hier an. Die Konstruktor-Methode ist wie unter C# die Methode, die beim Initialisieren eines Objekts auf Basis der Klasse automatisch ausgeführt wird.

Unter C# heißt diese wie die Klasse selbst, unter Visual Basic ist dies ganz anders: Hier lautet der Name der Konstruktor-Methode schlicht New. Die Konstruktor-Methode der folgenden Klasse KlasseMitFeld weist dem Feld ZeichenketteNurLesbar eine Zeichenkette zu. Die Methode Sub Main initialisiert die Klasse und gibt dann als Beweis die zugewiesene Zeichenkette aus:

Sub Main
     Dim KlasseMitFeld As New KlasseMitFeld
     Debug.WriteLine(KlasseMitFeld.ZeichenketteNurLesbar)
End Sub
Public Class KlasseMitFeld
     Public ReadOnly ZeichenketteNurLesbar As String
     Public Sub New
         ZeichenketteNurLesbar = "Wert von der Konstruktor-Methode zugewiesen"
     End Sub
End Class

Die Konstruktor-Methode ist ein von vielen VBA-Entwicklern schmerzlich vermisstes Feature: Damit können Sie einer Klasse direkt beim Initialisieren wichtige Informationen übermitteln, die dann auch direkt verarbeitet werden können – beispielsweise, um einer Kunde-Klasse direkt den Namen und die Adresse des Kunden zu übermitteln.

Eigenschaften

Felder können fast wie Eigenschaften genutzt werden – es gibt schreib- und lesbar Felder oder auch nur lesbare Felder (Read­Only). Eigenschaften erlauben aber eine genauere Steuerung der Berechtigungen und erlauben auch noch das Ausführen weiterer Aktionen, wenn der Eigenschaftswert geschrieben oder gelesen wird. Eine Eigenschaft enthält in der Regel eine lokale Variable, die den Eigenschaftswert speichert (die sogenannte Member-Variable), sowie ein öffentliches Property-Konstrukt, welches jeweils einen sogenannten Getter und einen Setter enthält. Das sieht dann insgesamt wie folgt aus:

Public Class KlasseMitEigenschaften
     Private _eigenschaft As String
     Public Property Eigenschaft As String
         Get
             Return _eigenschaft
         End Get
         Set(ByVal value As String)
            _eigenschaft = value

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.