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).
Bild 1: Einfügen einer neuen KlassendateiDie 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:
Bild 2: Experimentieren mit Klassen in LINQPadPublic 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 (ReadOnly). 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.