3.7 Klassen erstellen
 
Da VB.NET eine vollständig objektorientierte Programmiersprache ist, sollten Sie die Grundlagen der objektorientierten Programmierung beherrschen. Die Deklaration einer eigenen Klasse ist denkbar einfach:
Class Klassenname
' ...
End Class
Wenn Sie eine Klasse definieren, dann definieren Sie im Prinzip so etwas wie einen eigenen Datentyp. Dieser Datentyp kann jedoch nicht nur über Eigenschaften, sondern auch über eigene Methoden verfügen.
Mit dem Schlüsselwort New erzeugen Sie eine Instanz einer Klasse.
Dim a As Testklasse ' Variable deklarieren
a = New Testklasse() ' Instanz der Klasse erstellen
Dim b As Testklasse = New Testklasse() ' abküzende
' Schreibweise
3.7.1 Eigenschaften einer Klasse über Felder realisieren
 
Die einfachste Methode, um einer Klasse eine Eigenschaft zu geben, besteht darin, in der Klasse eine entsprechende Variable mit dem Schlüsselwort Public zu definieren. Anschließend können Sie bei jeder Klasseninstanz diese Eigenschaft zuweisen. Variablen, die innerhalb der Klasse mit Private deklariert werden, sind demgegenüber nur innerhalb der Klasse zugänglich.
Die Testumgebung, die in Abschnitt 3.1, vorgestellt wurde, können Sie auch für die Arbeit mit Klassen verwenden. vb_06.aspx enthält ein zusammenhängendes Beispiel.
<!-- vb_06.aspx -->
<%@ Page Language="VB" Debug="True" Strict="True" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim c As CBackware
c = New CBackware()
c.Name ="Brötchen"
'b.interneNummer = 25 ' nicht möglich
ausgabe.innerHTML = c.Name ' Brötchen
End Sub
Class CBackware
Private interneNummer As Integer
Public Name As String
End Class
</script>
<html><head><title>
Einstieg in VB.NET
</title></head>
<body>
<h3>Einstieg in VB.NET</h3>
<p id="ausgabe" runat="server"></p>
</body></html>
Wenn Sie eine Variable auf diese Weise über das Schlüsselwort Public zugänglich machen, handelt es sich um ein so genanntes Feld.
3.7.2 Eigenschaften mit Property-Prozeduren realisieren
 
Es gibt eine zweite Möglichkeit, für eine Klasse eine Eigenschaft zu definieren, und zwar über Property-Prozeduren. Die Klasse CBackware definiert in vb_07.aspx auf diese Weise die Eigenschaft Rezept:
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim c As CBackware = New CBackware()
c.Name ="Brötchen"
c.Rezept = "Wasser und Mehl"
ausgabe.innerHTML = c.Name & ": " & c.Rezept
' Brötchen: Wasser und Mehl
End Sub
Class CBackware
Private meinrezept As String
Public Name As String
Property Rezept() As String
Get
Return meinrezept
End Get
Set(ByVal inRezept As String)
meinrezept = inRezept
End Set
End Property
End Class
Auf den ersten Blick wirkt das Verfahren umständlich. Die Klasse enthält eine als Private deklarierte Variable meinrezept, auf die von außen nicht direkt zugegriffen werden kann. Stattdessen gibt es jetzt eine Prozedur Property Rezept(). Der aufrufende Code kann mit c.Rezept="Wasser und Mehl" diese Eigenschaft setzen. Innerhalb der Klasse läuft beim Zugriff auf diese Eigenschaft der betreffende Teil der Property-Prozedur ab. Bei einer Zuweisung wird der Get-Teil ausgeführt. Beim Abruf der Rezept-Eigenschaft wird der Set-Teil ausgeführt. Innerhalb der Property-Prozedur können Sie beliebigen Code erstellen. Auf diese Weise können Sie beispielsweise komplexere Gültigkeitsüberprüfungen realisieren.
3.7.3 Schreibgeschützte Eigenschaften
 
Mit Hilfe des Schlüsselwortes ReadOnly können Sie schreibgeschützte Eigenschaften realisieren. Bei einer schreibgeschützten Eigenschaft erstellen Sie nur den Get-Teil der Prozedur und lassen den Set-Teil weg.
Private meinpreis As Single = 0.37
' ...
ReadOnly Property Preis() As Single
Get
Return meinpreis
End Get
End Property
3.7.4 Methoden erstellen
 
Auch das Erstellen einer Methode für eine Klasse ist nicht weiter schwierig.
Public Function backen() As String
backen = "Fertig!"
End Function
Beim Aufruf etwa von c.backen() wird im Beispiel mit dem Brötchen die Meldung Fertig! ausgegeben.
3.7.5 Konstruktor erstellen
 
Mit dem Schlüsselwort New erstellen Sie eine neue Instanz einer Klasse. Häufig wissen Sie bereits beim Erstellen einer neuen Instanz, über welche speziellen Eigenschaften dieses konkrete Objekt verfügen soll. Mit Hilfe eines speziellen Konstruktors können Sie solche Eigenschaften bereits beim Instanzieren mit angeben. Im Beispiel mit den Backwaren wissen Sie beispielsweise bereits beim Erstellen einer solchen Variablen, ob Sie ein Brötchen oder ein Brot haben möchten. vb_08.aspx definiert innerhalb der Klasse CBackware mit der Prozedur Public Sub New (ByVal inName As String) einen Konstruktor, dem Sie den Namen des neu zu erstellenden Objekts gleich mit übergeben können.
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim s As String
Dim a As CBackware = New CBackware("Roggenbrot")
s = a.Name
ausgabe.innerHTML = s ' Roggenbrot
End Sub
Class CBackware
Public Name As String
' ...
Public Sub New(ByVal inName As String)
Name = inName
End Sub
' ...
End Class
3.7.6 Klassen vererben
 
Diese kleine Einführung kann nicht auf die Details der Vererbung von Klassen eingehen. Lediglich das Prinzip soll kurz erläutert werden. Bislang wurde als Beispiel eine Klasse CBackware erstellt. Wenn der Entwickler es nun oft mit verschiedenen Typen von Backwaren zu tun hat, die sich jeweils nur in einigen wenigen Aspekten voneinander unterscheiden, dann kann er für jeden Backwarentyp eine eigene Klasse erstellen. Dabei muss er aber nicht den gesamten Code von CBackware etwa in eine Klasse CBrot übernehmen. Mittels Vererbung kann er statt dessen festlegen, dass die Klasse CBrot zunächst einmal genauso funktionieren soll wie die Klasse CBackware. Wenn eine Anwendung für eine Variable vom Typ CBrot beispielsweise die Funktion backen() aufruft, wird ebenfalls die Meldung Fertig! ausgegeben.
Dabei muss die Methode backen() gar nicht in der Klasse CBrot implementiert sein. Es reicht, wenn die Basisklasse CBackware über diese Methode verfügt. Dann wird der Code der Basisklasse ausgeführt. Auf diese Weise kann Code optimal wiederverwendet werden. Wenn eine Eigenschaft oder eine Prozedur geringfügig anders funktionieren soll als in der Basisklasse, können diese Eigenschaften und Prozeduren überschrieben werden.
Auf diese Weise entstehen ganze Klassenhierarchien. Am Anfang steht meistens eine Klasse, die über relativ allgemeine und unspezifische Fähigkeiten verfügt. Von einer solchen Basisklasse werden speziellere Klassen vererbt, von denen noch speziellere Klassen abgeleitet sind.
Das beste Beispiel dafür sind die Klassen des .NET-Frameworks. Sämtliche Klassen des .NET-Frameworks stammen von der Basisklasse System.Object ab. Diese Klasse kennt nur wenige Eigenschaften und Methoden. System.Object hat beispielsweise die Methode Equals, die feststellt, ob zwei Objekte identisch sind. Die Methode ToString lässt sich gut für Debugging-Zwecke einsetzen. Sie gibt einen String aus, der das aktuelle Objekt beschreibt. Meistens gibt ToString lediglich den Namen der Klasse selbst aus.
Von System.Object stammen zahlreiche speziellere Klassen ab. Ein Beispiel ist die Klasse System.Web.UI.Control. Aber auch diese Control-Klasse ist noch recht allgemein gehalten. Von ihr stammt etwa die Klasse System.Web. UI.HtmlControls.HtmlControl ab. Von dieser Klasse stammt unter anderem System.Web.UI.HtmlControls.HtmlContainerControl ab. Und von HtmlContainerControl stammt System.Web.UI.HtmlControls.HtmlForm ab. HtmlForm repräsentiert ein Formular in einer HTML- beziehungsweise einer aspx-Seite. Selbst HtmlForm kennt aber noch die Methode ToString, die ursprünglich bereits System.Object zur Verfügung gestellt hat.
Die Klassen werden also immer spezieller, bis am Schluss eine Klasse für eine ganz konkrete Aufgabe steht. Bei der täglichen Arbeit haben Sie es hauptsächlich mit solchen spezialisierten Klassen zu tun, während die allgemeineren Klassen für die tägliche Programmierpraxis eine geringere Bedeutung haben. Das ist nicht anders als in der realen Welt. Es ließe sich eine allgemeine Klasse für Fahrzeuge konstruieren. In der Praxis wird man es aber meistens nicht mit einem abstrakten »Fahrzeug« zu tun haben, sondern mit einem Bus, einer Bahn, einem Fahrrad oder einem Lastwagen.
|