3 Klassendesign und Vererbung
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 und freigegebene 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 weitestgehenden 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. 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 müssen. 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 folgenden Codefragment der Klasse Person:
class Person {
public string Name;
}Ein Objekt wäre demnach beispielsweise itsme:
Person itsme = new Person();
Wie in C# üblich, wird zuerst der Datentyp angegeben. Eine Klassendefinition müssen Sie dabei grundsätzlich immer als die Beschreibung eines eigenen 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 nur durch die in der Klasse definierten Eigenschaften beschrieben werden. Objekte können auch Operationen ausführen, beispielsweise um die Eigenschaften zu manipulieren. Stellen Sie sich vor, Sie würden die Klasse Auto entwickeln. Ein Objekt vom Typ Auto besitzt Eigenschaften wie AnzahlDerRäder, Hubraum und Farbe, aber ein Auto-Objekt kann noch viel mehr: Es kann mit einer bestimmten Geschwindigkeit von A nach B fahren, beim Auftreten einer sich anbahnenden, verkehrsgefährdenden Situation kann es hupen. Fahren und Hupen können nicht durch Eigenschaften beschrieben werden. Es sind vielmehr Operationen, die das Verhalten eines Autos beschreiben. Im objektorientierten Sprachgebrauch wird eine von einem Objekt ausgeführte Operation auch als Methode bezeichnet.
Abbildung 3.1 Die Klasse »Auto«
Methoden werden in einer Klassenstruktur als Prozedur definiert, ähnlich wie Main einer Konsolenanwendung. Das folgende Codefragment demonstriert die Klasse Auto mit den drei Feldern Farbe, AnzahlDerRäder und Hubraum sowie der Methode Fahren:
class Auto { public int Farbe; public int AnzahlDerRäder; public float Hubraum; public void Fahren() { // Anweisungen } }
Jetzt wollen wir uns ansehen, wie wir mit der Klasse arbeiten. Dazu wird die Methode Main wie folgt codiert:
static void Main(string[] args) { Auto myCar = new Auto(); // Festlegung des Hubraums myCar.Hubraum = 2995; // das Auto-Objekt fahren lassen myCar.Fahren(); }
Zuerst besorgen wir uns ein Objekt vom Typ Auto. Das Objekt heißt im weiteren Verlauf myCar und hat die Eigenschaften Farbe, AnzahlDerRäder und Hubraum. Alle Eigenschaften müssen nicht unbedingt auf einen objektspezifischen Wert festgelegt werden, sondern nur die, die notwendig sind. Hier ist es nur die Eigenschaft Hubraum, der ein Wert zugewiesen wird. Anschließend wird die Methode Fahren 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 noch der gewünschte Wert zugewiesen werden.
Spielen mehrere konkrete Auto-Objekte im Programm eine Rolle, muss die Klasse Auto wiederholt instanziiert werden. Im folgenden Code liegen zwei Objekte vor: myCar und yourCar. Beide unterscheiden sich im Hubraum.
Auto myCar = new Auto(); myCar.Hubraum = 2995; Auto yourCar = new Auto(); yourCar.Hubraum = 1599;
3.1.1 Vorteile der objektorientierten Programmierung 

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 Programmiersprachen 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.
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.





Jetzt bestellen





