3 Das Klassendesign
Die objektorientierte Programmierung mit allen ihren dahinter stehenden Konzepten ist nicht einfach zu lernen. Dennoch hat sich das Konzept in den vergangenen Jahren in nahezu allen Entwicklungsumgebungen durchgesetzt. Wenn alle Welt davon spricht und der objektorientierte Ansatz in aller Munde ist, muss es für ihn ein paar schlagkräftige Argumente geben. Die beiden wichtigsten seien an dieser Stelle genannt:
Wiederverwendbarkeit: Klassen modularisieren eine Anwendung in unabhängige Einheiten. Sie verwalten zusammengehörende Daten und gruppieren ähnliche Methoden. Klassen können bausteinähnlich in verschiedenen Programmen – in der .NET-Laufzeitumgebung sogar vollkommen unabhängig von der verwendeten Programmiersprache – gleichwertig eingesetzt werden. Als Konsequenz dessen ändert sich auch der Arbeitsablauf der Programmierung: Programme müssen nicht mehr in allen Einzelheiten neu geschrieben werden, sie werden zu einem großen Teil aus fertigen Komponenten zusammengesetzt – vergleichbar mit der Entwicklung und dem Zusammenbau eines Motors, bei dem im Wesentlichen genormte Maschinenteile (Schrauben, Bolzen etc.) zum Einsatz kommen.
Wartungsaufwand: Eine Klasse kann als eigene, separate und unabhängige Einheit getestet werden. Es ist vollkommen ausreichend, die Klassenimplementierung nur einmal ausgiebig zu testen. Verläuft der Test positiv, wird die Klasse mit jeder Anwendung zufriedenstellend zusammenarbeiten. Das Testen im Umfeld mehrerer Anwendungen entfällt und stellt damit die Effizienz der Programmierung sicher.
In diesem Kapitel werden Sie lernen, wie eine Klasse definiert wird, welche Mitglieder (Member) eine Klassendefinition enthalten kann. Das Klassenkonzept werden wir im sich anschließenden Kapitel noch verbessern und verfeinern, wenn wir die Gesichtspunkte der Vererbung erörtern.
3.1 Einführung in die Objektorientierung
Die beiden wichtigsten Begriffe, die im Mittelpunkt der objektorientierten Betrachtungen stehen, sind die der Klasse und des Objekts. Was ist darunter zu verstehen?
Stellen Sie sich ein Architekturbüro vor, das ein Einfamilienwohnhaus plant und den Bauplan als Ergebnis aller anfänglichen Forderungen und der daraus resultierenden Berechnungen zeichnet. Der Bauplan enthält die Abmessungen des Grundrisses der einzelnen Etagen, die Angaben, wo Fenster und Türen eingebaut werden, die Mauerdicken, die Lage der Elektroverkabelung, der Heizungsrohre usw. Der fertige Bauplan dient anschließend als Vorlage für die Bauausführung. Vielleicht hat der Architekt sogar die Möglichkeit, den Bauplan mehrfach zu benutzen, um darauf basierend ein zweites oder gar ein drittes Haus zu erstellen. Die Häuser müssen nicht identisch sein, sie können sich in Einzelheiten unterscheiden: Die Außenfassade des ersten Hauses mag geputzt sein, die des zweiten geklinkert, ein Haus wird mit einer Ölheizung ausgestattet, das andere nutzt Fernwärme.
Der Bauplan dient also nur als Vorlage. Er ist also im weitesten Sinn eine Schablone, die zur Realisierung konkreter Häuser dient. Projiziert auf die objektorientierte Welt, ist der Bauplan als eine Klasse zu verstehen und ein fertig gebautes Haus als ein Objekt. Liegt ein Bauplan (= Klasse) vor, kann er dazu dienen, beliebig viele Häuser (= Objekte) zu erstellen, die sich durchaus unterscheiden dürfen.
In der objektorientierten Programmierung spricht man von einem Objekt oder auch von einem konkreten Objekt, wenn aus der Klassendefinition heraus etwas »Gegenständliches« erzeugt wird. Ein weiterer, häufig benutzter Begriff ist der der Klasseninstanz oder einfach nur Instanz bzw. Referenz. Sie können diese Begriffe synonym nebeneinander verwenden, sie besagen dasselbe.
Ein Objekt wird durch bestimmte, charakteristische Merkmale beschrieben, die in der Klassendefinition festgelegt werden. Diese werden als Eigenschaften bezeichnet. Beispielsweise könnte ein Objekt vom Typ Person im Rahmen der anwendungsspezifischen Forderungen durch den Namen der Person, deren Augenfarbe, Schuhgröße und das Geschlecht ausreichend beschrieben werden.
Im einfachsten Fall wird eine Eigenschaft als Variable innerhalb der Klassenstruktur definiert und als Feld bezeichnet, wie beispielsweise Name im Listing 3.1 der Klasse Person:
class Person {
public string Name;
}
Listing 3.1 Eine einfache Klasse mit einem Feld
Ein Objekt wäre demnach beispielsweise peter:
Person peter = new Person();
Wie bei jeder Variablendeklaration in C# üblich, wird zuerst der Datentyp angegeben. Eine Klassendefinition müssen Sie grundsätzlich immer als die Beschreibung eines Datentyps verstehen. Person ist daher ein Datentyp, genauso wie String oder Integer. Der Typangabe folgt der Variablenbezeichner. Mit dem Schlüsselwort new wird das Objekt schließlich konkretisiert. Dabei wird ein sogenannter Konstruktor aufgerufen.
Eine Klasse abstrahiert Objekte aber nicht nur in der Weise, dass Objekte gleichen Typs ausschließlich durch die in der Klasse definierten Eigenschaften beschrieben werden. Objekte können auch Operationen ausführen, gewissermaßen also ein Verhalten zeigen. Beispielsweise könnte ein Person-Objekt laufen, rufen, essen usw. Dabei handelt es sich um Operationen, die im objektorientierten Sprachgebrauch als Methoden bezeichnet werden.
Methoden werden innerhalb einer Klasse definiert. Das folgende Listing zeigt die um die Eigenschaft Alter und die Methode Laufen ergänzte Klasse Person:
class Person {
public string Name;
public int Alter;
public void Laufen() {
// Anweisungen
}
}
Listing 3.2 Klasse »Person« mit zwei Eigenschaften und einer Methode
Jetzt wollen wir uns ansehen, wie wir mit der Klasse arbeiten. Dazu wird die Methode Main wie folgt codiert:
static void Main(string[] args) {
Person peter = new Person();
// Festlegung des Alters
peter.Alter = 34;
// das Person-Objekt laufen lassen
peter.Laufen();
}
Listing 3.3 Testen der Klasse »Person«
Zuerst besorgen wir uns ein Objekt vom Typ Person. Das Objekt heißt peter und hat die spezifischen Eigenschaften Name und Alter. Alle Eigenschaften (Felder) müssen nicht unbedingt auf einen objektspezifischen Wert festgelegt werden, sondern nur die, die im Kontext des Programmcodes notwendig sind. Hier ist es nur die Eigenschaft Alter, der ein Wert zugewiesen wird. Anschließend wird die Methode Laufen aufgerufen. Beachten Sie den Punktoperator, der dazu dient, eine Eigenschaft oder Methode auf ein bestimmtes Objekt aufzurufen. Handelt es sich um eine Eigenschaft, muss ihr mit dem Zuweisungsoperator der gewünschte Wert zugewiesen werden.
Spielen mehrere konkrete Person-Objekte im Programm eine Rolle, muss die Klasse Person wiederholt instanziiert werden. Im folgenden Code liegen zwei Objekte vor: peter und bettina. Beide unterscheiden sich im Alter.
Person peter = new Person();
peter.Alter = 34;
Person bettina = new Person();
bettina.Alter = 15;
Listing 3.4 Zwei Objekte vom Typ »Person«
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.