# 3 Klassendesign Die Grundlagen der Sprache C# haben Sie im letzten Kapitel gelernt. In diesem Kapitel behandeln wir die Grundsätze der Klassendefinitionen – deren Kenntnis ist unabdingbar, da das gesamte .NET Framework objektorientiert ist. ## 3.1 Einführung in die Objektorientierung Die beiden wichtigsten Begriffe, die im Mittelpunkt unserer Betrachtungen zur objektorientierten Programmierung 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 sogar 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 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 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 Codefragment demonstriert die Klasse Person mit den beiden Feldern Name und Alter sowie der Methode Laufen:
    class Person {
      public string Name;
      public int Alter;
      public void Laufen() {
        // 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) {
      Person peter = new Person();
      // Festlegung des Alters
      peter.Alter = 34;
      // das Person-Objekt laufen lassen
      peter.Laufen();
    }
Zuerst besorgen wir uns ein Objekt vom Typ Person. Das Objekt heißt im weiteren Verlauf peter und hat die Eigenschaften Name und Alter. Alle Eigenschaften müssen nicht unbedingt auf einen objektspezifischen Wert festgelegt werden, sondern nur die, die 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 noch 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 durch ihr Alter.
    Person peter = new Person();
    peter.Alter = 34;
    Person bettina = new Person();
    bettina.Alter = 15;
### 3.1.1 Vorteile der objektorientierten Programmierung Die objektorientierte Programmierung (OOP) 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. 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, sondern 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.