Objektorientierte Programmierung, Teil 1

Wer mit VBA programmiert, nutzt eigentlich schon eine Reihe der Elemente der objektorientierten Programmierung – zum Beispiel, wenn er Objekte auf Basis der Klasse Database oder Recordset erstellt und dann mit deren Methoden und Eigenschaften durch die Daten einer Tabelle navigiert. Auch benutzerdefinierte Klassen lassen sich mit VBA erstellen. Unter C# erhalten Sie jedoch Zugriff auf den kompletten Umfang der objektorientierten Programmierung. Dieser Artikel liefert einen Einstieg in die objektorientierte Programmierung mit C#.

Prozeduren starten ade

Eines müssen wir direkt klarstellen: Einfach mal eben wie im VBA-Editor eine Prozedur in einem Standardmodul programmieren und diese mit F5 ausführen – das gelingt in Visual Studio unter C# nicht. Dort müssen Sie etwa in einer Konsolenanwendung zumindest die standardmäßig vorhandene Klasse verwenden, die dort enthaltene Prozedur Main mit den gewünschten Codezeilen füllen und auf F5 drücken.

Die Klasse Program

Wenn Sie ein neues Projekt auf Basis der Vorlage Konsolenanwendung erstellen, erhalten Sie eine Datei mit einer Klasse namens Program mit einer Methode namens Main, die standardmäßig beim Start der Anwendung ausgeführt wird.

Von der Methode Main aus werden wir gleich starten, um unsere erste selbst erstellte Klasse zu instanzieren und zu nutzen.

Eine Klasse pro Datei

Jede Klasse sollte in einer eigenen Datei erstellt werden, um die Übersicht zu gewährleisten. Sollten Sie mehrere Klassen in einer Datei anlegen, finden Sie solche Klassen, deren Name sich von dem der Datei unterscheidet, nicht mehr so schnell über den Projektmappen-Explorer wieder.

Neue Klasse erstellen

Dementsprechend beginnen wir nun, indem wir eine neue Klasse erstellen. Dies erledigen wir über den Menüeintrag Projekt|Klasse hinzufügen… Dies öffnet den Dialog Neues Element hinzufügen und stellt die Vorlage direkt auf den Eintrag Klasse ein. Wir nennen die Klasse Konto und klicken dann auf Hinzufügen (siehe Bild 1). Alternativ öffnen Sie den Dialog Neues Element mit dem Kontextmenü-Eintrag Hinzufügen|Klasse… des Eintrags für das Projekt im Projektmappen-Explorer.

Hinzufügen einer neuen Klasse

Bild 1: Hinzufügen einer neuen Klasse

Die neue Klasse erscheint nun sowohl im Projektmappen-Explorer als auch mit dem vollständigen Quellcode im Code-Fenster (siehe Bild 2). Abgesehen von den using-Anweisungen, dem namespace– und dem class-Element ist die Klasse noch jungfräulich:

Die neue, noch unberührte Klasse Konto

Bild 2: Die neue, noch unberührte Klasse Konto

namespace OOProgrammierung {
     class Konto {
     }
}

Benennung

Der Klassenname sollte möglichst genau beschreiben, welchem Objekt der Realität die Klasse entspricht – sofern dies gegeben ist. Soll die Klasse eine Person aufnehmen, heißt sie Person, soll sie wie in unserem Fall ein Konto aufnehmen, lautet der Klassenname Konto.

Wir verwenden kein Präfix, außerdem beginnt der Klassenname mit einem Großbuchstaben. Besteht der Klassenname aus mehreren zusammengesetzten Wörtern, sollten auch die folgenden Wörter jeweils wieder groß geschrieben werden.

Wenn Sie den Namen der Datei mit der Klasse später noch einmal ändern möchten, erledigen Sie da am besten über den Projektmappen-Explorer. Visual Studio ändert dann optional alle Verweise auf diese Klasse. Wenn Sie den Dateinamen Konto in Bankkonto ändern, benennt Visual Studio auch automatisch die Klasse im Code um.

Objekt instanzieren

Die Klasse ist zwar noch leer (sie hat noch keine Methoden, Eigenschaften et cetera), aber wir können diese dennoch bereits deklarieren und auch instanzieren. Dazu wechseln Sie nun zur Klasse Program. Dort erweitern Sie die Methode Main um zwei Zeilen:

static void Main(string[] args) {
     Konto konto;
     konto = new Konto();
}

Die erste Zeile deklariert ein neues Objekt namens konto mit dem Typ Konto (man beachte die Groß-/Kleinschreibung). Beides können Sie auch in einer einzigen Anweisung erledigen:

Konto konto = new Konto();

Die Deklaration reserviert den Speicher für das Objekt, die new-Anweisung erstellt das Objekt nach dem in der Klasse definierten Bauplan. Mit dem Objekt können wir nun noch nicht viel anfangen, da wir noch keine Methoden oder Eigenschaften hinzugefügt haben.

Sie können auch mehrere Objekte auf Basis der gleichen Klasse erstellen:

Konto konto1 = new Konto();
Konto konto2 = new Konto();

Sichtbarkeit der Klasse

Wenn Sie mit Access gearbeitet haben, kennen Sie die Klassenbibliotheken, die Sie üblicherweise per Verweis in ein VBA-Projekt eingebunden haben. Diese haben dann, sowohl über den Objektkatalog einsehbare als auch im Code referenzierbare Klassen bereitgestellt. Wenn Sie eine Klasse in einem C#-Projekt erstellen, um von anderen Anwendung darauf zuzugreifen, müssen Sie die Deklaration dieser Klasse mit dem Schlüsselwort public versehen:

     public class Konto {
     }

Wenn Sie das Schlüsselwort public nicht angeben, verwendet die Klasse die Standardeinstellung, welche dem Einsatz des Schlüsselworts internal entspricht und den Zugriff von außerhalb der Klassenbibliothek verwehrt.

Objekt freigeben

Objekte belegen Arbeitsspeicher. Unter VBA haben Sie eine Objektvariable durch Setzen auf den Wert Nothing freigegeben:

VBA-Code:
Set rst = Nothing

Unter C# stellen Sie das Objekt auf den Wert null ein:

konto = null;

Damit können Sie nun nicht mehr auf das Objekt zugreifen. Der Speicherplatz wird jedoch erst freigegeben, wenn die Garbage Collection startet und das Objekt löscht. Dies geschieht je nach Auslastung (bei hoher Auslastung seltener) und verfügbarem Speicherplatz (wenn der Platz knapp wird) oder bei Schließen der Anwendung.

Eigenschaften einer Klasse

Unsere Konto-Klasse soll verschiedene Eigenschaften bieten, zum Beispiel Kontoinhaber, Bankleitzahl, Kontonummer, Kontostand und Dispositionsrahmen. Um diese Eigenschaften nach dem Instanzieren eines Objekts auf Basis der Klasse Konto zu lesen und auch zu schreiben, deklarieren Sie diese wie folgt:

class Konto {
     public string Kontoinhaber;
     public string Kontonummer;
     public string Bankleitzahl;
     public decimal Kontostand;
     public decimal Dispositionsrahmen;
}

Sie können dann von einer anderen Klasse aus, in diesem Fall Program, per IntelliSense auf die Eigenschaften zugreifen (siehe Bild 3). Dort sehen Sie noch einige weitere Methoden, beispielsweise Equals oder GetType.

Eigenschaften per IntelliSense

Bild 3: Eigenschaften per IntelliSense

Eigenschaften zuweisen und ausgeben

Das folgende Beispiel deklariert und instanziert das Objekt konto auf Basis der Klasse Konto, weist den Eigenschaften Werte zu und gibt diese dann in der Konsole aus:

Konto konto;
konto = new Konto();
konto.Kontoinhaber = "André Minhorst";
konto.Kontonummer = "1234567890";
konto.Bankleitzahl = "87654321";
konto.Kontostand = 100;
konto.Dispositionsrahmen = 1000;
Console.WriteLine("Kontoinhaber: {0}", konto.Kontoinhaber);
Console.WriteLine("Kontonummer:  {0}", konto.Kontonummer);
Console.WriteLine("Bankleitzahl: {0}", konto.Bankleitzahl);
Console.ReadLine();

Datenkapselung

Von VBA kennen Sie es vielleicht bereits: Die Eigenschaften einer Klasse werden nie als öffentliche Variablen deklariert, sondern mit den Schlüsselwort Private. Stattdessen erstellen Sie sogenannte Property Get– und Property Let– (für Werttypen) oder Property Set-Methoden (für Referenztypen), um auf die Inhalte der jeweiligen Variablen zuzugreifen. Hier haben wir dann zunächst eine private Variable für den Wert der Eigenschaft deklariert:

'VBA-Code:
Private m_Kontostand As Currency

Die Property Let-Methode erlaubte dann das Setzen des Wertes dieser Variablen von außerhalb der Klasse:

'VBA-Code:
Public Property Let Kontostand(curKontostand As Currency)
     m_Kontostand = curKontostand
End Property

Mit der Get-Methode konnte man den Wert hingegen lesen:

'VBA-Code:
Public Property Get Kontostand As Currency
     Kontostand = m_Kontostand
End Property

Durch diese Methoden war es möglich, beispielsweise Eingaben auf ihre Gültigkeit hin zu prüfen. Unter C# sieht das ähnlich aus, allerdings ist der Aufbau etwas anders. Die Deklaration ändern wir, indem wir das Schlüsselwort public auf private ändern. Außerdem soll die Schreibweise mit dem großen Anfangsbuchstaben für die Eigenschaft nach außen hin erkennbar sein. Das heißt, dass wir den Namen der Variablen ändern müssen – Namen für Variablen, Methoden, Eigenschaften et cetera müssen innerhalb eines Namespaces eindeutig sein.

Also ändern wir beim Variablennamen den großen Anfangsbuchstaben in einen kleinen:

private string kontoinhaber;

Wenn Sie dies zu unübersichtlich finden, können Sie alternativ auch etwa den Namen mit Großbuchstaben verwenden und diesem einen Unterstrich voranstellen – also etwa _Kontoinhaber. Außerdem fügen wir eine öffentliche Eigenschaft mit einem get– und einem set-Block hinzu. Diese wird wieder mit großem Anfangsbuchstaben notiert:

public string Kontoinhaber {
     get {
         return kontoinhaber;
     }
     set {
         kontoinhaber = value;           
     }
}

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar