## 3.2 Klassendefinition ### 3.2.1 Klassen in Visual Studio anlegen Eine Klasse ist die grundlegendste Einheit der objektorientierten Programmierung und dient dazu, einen Datentyp zu definieren. Starten Sie ein neues Projekt vom Typ Konsolenanwendung, ist die Struktur einer Klasse bereits vordefiniert. Der Quellcode befindet sich in einer Datei mit der Dateierweiterung .CS. Dateiname und Klassenbezeichner sind per Vorgabe identisch, müssen es aber nicht sein. In einer Quellcodedatei können Sie auch mehrere Klassen definieren, was allerdings nicht empfehlenswert ist, weil darunter die Übersicht leidet. Möchten Sie eine zusätzliche Klasse in einer eigenen Quellcodedatei implementieren, haben Sie zwei Alternativen: Sie wählen im Menü Projekt der Entwicklungsumgebung das Untermenü Klasse hinzufügen... Sie öffnen mit der rechten Maustaste das Kontextmenü des Projekts im Projektmappen-Explorer, wählen Hinzufügen und danach aus der sich anschließend öffnenden Liste Klasse hinzufügen... Daraufhin öffnet sich das Dialogfenster Neues Element hinzufügen, in dem die Vorlage Klasse bereits vorselektiert ist. Sie sollten einen möglichst beschreibenden Klassennamen wählen, der auch gleichzeitig zum Namen der Quellcodedatei wird. Wenn Sie wollen, können Sie später sowohl die Klasse als auch die Quellcodedatei umbenennen. Zur Bezeichnung von Klassen gibt es Konventionen, an denen Sie sich orientieren sollten: Der erste Buchstabe sollte großgeschrieben werden. Setzt sich der Bezeichner einer Klasse aus mehreren einzelnen Begriffen zusammen, wird empfohlen, zur besseren Lesbarkeit jeden Begriff mit einem Großbuchstaben zu beginnen. Ein Klassenbezeichner sollte nicht dadurch kenntlich gemacht werden, dass ihm ein »C« oder ein anderes Präfix vorangestellt wird, wie es in anderen objektorientierten Sprachen teilweise üblich ist. Erscheint Ihnen der Name der Quellcodedatei zu einem späteren Zeitpunkt unpassend, können Sie im Projektmappen-Explorer das Kontextmenü der entsprechenden Datei öffnen, Umbenennen wählen und den neuen Namen eingeben oder im Projektmappen-Explorer die umzubenennende Datei selektieren und im Eigenschaftenfenster unter Dateiname den neuen Namen eintragen. ### 3.2.2 Das Projekt »GeometricObjectsSolution« Wir wollen an dieser Stelle mit einem Projekt beginnen, das uns über einige Kapitel dieses Buches hinweg begleiten wird. Nach und nach wird das Projekt ergänzt und erweitert, und am Ende werden nahezu alle objektorientierten Features von .NET in den zu diesem Projekt gehörenden Klassen enthalten sein. Bei den Klassen handelt es sich um die syntaktischen Beschreibungen geometrischer Objekte wie zum Beispiel um die Beschreibung eines Kreises und eines Rechtecks. Am Ende werden wir feststellen, dass die entwickelten Klassen nicht nur in einer Konsolenanwendung sinnvoll einzusetzen sind, sondern auch anderen Anwendungen als Bibliothek zur Verfügung gestellt werden sollten. Mit anderen Worten: Wir werden am Ende aus der ursprünglichen Konsolenanwendung eine Klassenbibliothek machen. In einer laufenden Instanz von Visual Studio 2010 können Sie gleichzeitig mehrere Projekte bearbeiten. Diese können miteinander in Beziehung stehen (beispielsweise wie bei einer Client-Server-Lösung), müssen es aber nicht zwangsläufig. Alle Projekte werden von einer sogenannten Projektmappe verwaltet, die die Anwendungen einer laufenden Visual Studio-Instanz in einer SLN-Datei regelrecht zusammenschraubt. Die Dateierweiterung SLN steht dabei für Solution. Die Projektmappe wird im Dateisystem durch einen Ordner beschrieben, in dem alle zu der Projektmappe gehörenden Projekte als Unterordner enthalten sind. Wir wollen nun mit dem angekündigten Projekt beginnen, das als Konsolenanwendung bereitgestellt wird. Das Projekt soll GeometricObjects heißen. Zudem können Sie bereits beim Anlegen des Projekts eine Projektmappe bereitstellen und dieser einen passenden Namen geben. In unserem Beispiel soll sie GeometricObjectsSolution heißen. Hier klicken, um das Bild zu vergrößern Abbildung 3.1 Anlegen einer neuen Projektmappe Nachdem wir die Projektmappe GeometricObjectsSolution mit der Konsolenanwendung GeometricObjects angelegt haben, wollen wir uns der ersten Klasse widmen, die Circle heißen soll. Markieren Sie dazu das Projekt GeometricObjects im Projektmappen-Explorer, öffnen Sie das Kontextmenü, und wählen Sie Hinzufügen • Klasse … Tragen Sie den Namen der Datei im sich daraufhin öffnenden Dialog ein (Circle.cs), und bestätigen Sie die Angaben. Das Projekt ist danach um die Klasse Circle erweitert worden, weil der Dateibezeichner automatisch als neuer Bezeichner der Klasse verwendet wird. Die Gleichnamigkeit zwischen Datei und Klasse ist aber keine Notwendigkeit. Die neue Klasse hat die folgende Struktur:
    namespace GeometricObjects
    {
      class Circle
      {
      }
    }
Weil die Klasse später in Form einer Klassenbibliothek veröffentlicht werden soll, empfiehlt es sich, die Klasse um den Zugriffsmodifizierer public zu ergänzen, also:
    public class Circle
### 3.2.3 Deklaration von Objektvariablen Eine Klassendefinition beschreibt den Bauplan eines Objekts und gilt als Typdefinition. Um ein Objekt eines bestimmten Typs zu erzeugen, muss zunächst für jedes Objekt eine Objektvariable deklariert werden, beispielsweise:
    Circle kreis;
> Eine Objektvariable verweist auf einen Speicherbereich. Man sagt daher auch, dass eine Objektvariable ein Objekt referenziert, und spricht bei einer Objektvariablen von einer Objektreferenz oder einfach nur von einer Referenz. Tatsächlich ist unter einer Referenz ein Zeiger auf die Startadresse des Speicherbereichs zu verstehen, der alle Zustandsdaten enthält. Zustandsdaten sind die Eigenschaften, die das Objekt von einem anderen Objekt desselben Typs unterscheiden. Bei der Deklaration der Objektvariablen kreis wird der für das Objekt erforderliche Speicher reserviert, aber ein konkretes Objekt existiert noch nicht, denn die Objektvariable ist noch nicht initialisiert. Zur Initialisierung einer Objektvariablen bieten sich zwei gleichwertige Alternativen an: die zweizeilige Variante:
>     Circle kreis;
>     kreis = new Circle();
> die insgesamt etwas kürzere, einzeilige Schreibweise:
>     Circle kreis = new Circle();
Beide weisen ein gemeinsames Merkmal auf: den Operator new, der für die Konkretisierung eines Objekts verantwortlich ist. Erst mit new beginnt die Existenz des Objekts. Dahinter verbirgt sich der Aufruf einer ganz bestimmten Methode, die als Konstruktor bezeichnet wird. Wir werden uns weiter unten damit noch beschäftigen. Sie können in einer Anweisung auch mehrere Variablen desselben Typs deklarieren. Dazu werden die Objektvariablen hintereinander geschrieben und durch ein Komma voneinander getrennt:
    Circle kreis1, kreis2, kreis3;
Der C#-Compiler erlaubt auch die folgende Anweisung:
    Circle kreis1, kreis2, kreis3 = new Circle();
Allerdings wird nur die zuletzt angegebene Objektvariable kreis3 initialisiert. kreis1 und kreis2 gelten nur als deklariert und müssen zu einem späteren Zeitpunkt noch mit
    kreis1 = new Circle();
    kreis2 = new Circle();
initialisiert werden. ### 3.2.4 Zugriffsmodifizierer einer Klasse Wenn Sie eine neue Klasse entwickeln, müssen Sie einem Umstand besondere Beachtung schenken: Entwerfen Sie die Klasse, um sie ausschließlich in der Anwendung zu verwenden, in der die Klasse definiert ist, oder beabsichtigen Sie, die Klasse auch anderen Anwendungen zur Verfügung zu stellen? Diese Sichtbarkeit wird durch Zugriffsmodifizierer beschrieben. Bei Klassen spielen nur zwei eine Rolle: public und internal.

Tabelle 3.1 Die Zugriffsmodifizierer einer Klasse

Modifizierer | Beschreibung
public | Die Instanziierbarkeit einer öffentlichen Klasse unterliegt keinerlei Beschränkungen. Die Klasse kann dann aus jeder beliebigen Anwendung heraus instanziiert werden.
internal | Beabsichtigen Sie, die Sichtbarkeit einer Klasse auf die Anwendung zu beschränken, in der die Klasse definiert ist, müssen Sie die Klasse als internal deklarieren. Aus einer anderen Anwendung heraus kann dann auch kein Objekt dieser Klasse erzeugt werden.
Die Angabe des Zugriffsmodifizierers ist optional. Verzichten Sie darauf, gilt die Klasse als internal. ### 3.2.5 Splitten einer Klassendefinition mit »partial« Klassendefinitionen in .NET lassen sich über mehrere Sourcecodedateien verteilen. Diese Programmiertechnik erlaubt es mehreren Entwicklern, gleichzeitig an der gleichen Klasse zu arbeiten. Das Prinzip der partiellen Klassen wird auch von der Entwicklungsumgebung genutzt, denn durch die Aufteilung des Klassencodes auf mehrere Quellcodedateien lässt sich der von Visual Studio automatisch generierte Code sauber von dem Code trennen, den der Entwickler schreibt. Das verschafft nicht nur einen besseren Überblick über den eigenen Code, sondern reduziert auch potenzielle Probleme, die auftreten können, wenn der automatisch erzeugte Code vom Entwickler verändert werden sollte. Partielle Klassendefinitionen werden dadurch gekennzeichnet, dass man den Modifizierer partial vor alle Teildefinitionen setzt. Die Signatur muss natürlich in jeder Teildefinition identisch sein. Nehmen wir beispielsweise an, Sie möchten die Klasse Circle auf die beiden Dateien Circle1.cs und Circle2.cs aufsplitten. Dann müssten die Klassendefinitionen wie folgt lauten:
    // in der Quellcodedatei 'Circle1.cs'
    partial class Circle {
      ...
    }
    // in der Quellcodedatei 'Circle2.cs'
    partial class Circle {
      ...
    }