Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 5. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Weitere .NET-Datentypen
7 Weitere Möglichkeiten von C#
8 Auflistungsklassen (Collections)
9 Fehlerbehandlung und Debugging
10 LINQ to Objects
11 Multithreading und die Task Parallel Library (TPL)
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 Einige wichtige .NET-Klassen
15 Projektmanagement und Visual Studio 2010
16 XML
17 WPF – Die Grundlagen
18 WPF-Containerelemente
19 WPF-Steuerelemente
20 Konzepte der WPF
21 Datenbindung
22 2D-Grafik
23 ADO.NET – verbindungsorientierte Objekte
24 ADO.NET – Das Command-Objekt
25 ADO.NET – Der SqlDataAdapter
26 ADO.NET – Daten im lokalen Speicher
27 ADO.NET – Aktualisieren der Datenbank
28 Stark typisierte DataSets
29 LINQ to SQL
30 Weitergabe von Anwendungen
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual C# 2010 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2010

Visual C# 2010
geb., mit DVD
1295 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1552-7
Pfeil 4 Vererbung, Polymorphie und Interfaces
Pfeil 4.1 Die Vererbung
Pfeil 4.1.1 Basisklassen und abgeleitete Klassen
Pfeil 4.1.2 Ableitung einer Klasse
Pfeil 4.1.3 Klassen, die nicht abgeleitet werden können
Pfeil 4.1.4 Konstruktoren in abgeleiteten Klassen
Pfeil 4.1.5 Der Zugriffsmodifizierer »protected«
Pfeil 4.1.6 Konstruktorverkettung in der Vererbung
Pfeil 4.2 Der Problemfall geerbter Methoden
Pfeil 4.2.1 Geerbte Methoden mit »new« verdecken
Pfeil 4.2.2 Abstrakte Methoden
Pfeil 4.2.3 Virtuelle Methoden
Pfeil 4.3 Typumwandlung und Typuntersuchung von Objektvariablen
Pfeil 4.3.1 Implizite Typumwandlung von Objektreferenzen
Pfeil 4.3.2 Explizite Typumwandlung von Objektreferenzen
Pfeil 4.3.3 Typuntersuchung mit dem is-Operator
Pfeil 4.3.4 Typumwandlung mit dem as-Operator
Pfeil 4.4 Polymorphie
Pfeil 4.4.1 »Klassische« Methodenimplementierung
Pfeil 4.4.2 Abstrakte Methoden
Pfeil 4.4.3 Virtuelle Methoden
Pfeil 4.4.4 Versiegelte Methoden
Pfeil 4.4.5 Überladen einer Basisklassenmethode
Pfeil 4.4.6 Statische Member und Vererbung
Pfeil 4.5 Das Projekt »GeometricObjectsSolution« ergänzen
Pfeil 4.6 Hat-ein(e)-Beziehungen
Pfeil 4.6.1 Innere Klassen (Nested Classes)
Pfeil 4.7 Interfaces (Schnittstellen)
Pfeil 4.7.1 Schnittstellendefinition
Pfeil 4.7.2 Schnittstellenimplementierung
Pfeil 4.7.3 Interpretation der Schnittstellen
Pfeil 4.8 Das Zerstören von Objekten – der Garbage Collector
Pfeil 4.8.1 Arbeitsweise des Garbage Collectors
Pfeil 4.8.2 Expliziter Aufruf des Garbage Collectors
Pfeil 4.8.3 Der Destruktor
Pfeil 4.8.4 Die »IDisposable«-Schnittstelle
Pfeil 4.8.5 Ergänzungen in den Klassen »Circle« und »Rectangle«


Galileo Computing - Zum Seitenanfang

4.5 Das Projekt »GeometricObjectsSolution« ergänzen topZur vorigen Überschrift

Wir wollen uns nun noch einmal dem von uns immer weiter entwickelten Beispielprojekt GeometricObjects zuwenden. Wir werden den Entwurf zuerst um zwei weitere Klassen, nämlich um Rectangle und GraphicRectangle, ergänzen und uns dabei die in diesem Kapitel gewonnenen Kenntnisse zunutze machen. Die Klasse Rectangle soll ein Rechteck beschreiben, und die Klasse GraphicRectangle soll eine Operation bereitstellen, um ein Rectangle-Objekt in einer grafikfähigen Komponente darzustellen – analog zur Klasse GraphicCircle.

Ebenso wie ein Circle-Objekt soll auch ein Rectangle-Objekt seine Lage beschreiben. Um bei der üblichen Konvention grafischer Benutzeroberflächen zu bleiben, soll es sich dabei um den oberen linken Punkt des Rechtecks handeln. Die Größe eines Rechtecks wird durch seine Breite und Länge definiert. Außerdem sind Methoden vorzusehen, um Umfang und Fläche zu berechnen und zwei Rectangle-Objekte zu vergleichen


Hinweis

Auf der Buch-DVD finden Sie die beiden neuen Klassen im Projekt Beispiele\Kapitel 4\GeometricObjectsSolution_1.


Es ist deutlich zu erkennen, dass sich die Klassen Rectangle und Circle ähneln. Dies spricht dafür, den beiden Klassen eine Basisklasse vorzuschalten, die die gemeinsamen Merkmale eines Kreises und eines Rechtecks beschreibt: Wir werden diese Klasse im Folgenden GeometricObject nennen.

Ein weiteres Argument für diese Lösung ist die sich daraus ergebende Gleichnamigkeit der gemeinsamen Merkmale: Es werden dann die Methoden, die ihren Fähigkeiten nach Gleiches leisten, unabhängig vom Typ des zugrunde liegenden Objekts in gleicher Weise aufgerufen. Einerseits lässt sich dadurch die abstrahierte Artverwandtschaft der beiden geometrischen Objekte Kreis und Rechteck verdeutlichen, andererseits wird die Benutzung der Klassen wesentlich vereinfacht, da nicht zwei unterschiedliche Methodennamen dasselbe Leistungsmerkmal beschreiben. Nach diesen ersten Überlegungen soll nun die Klasse GeometricObject implementiert werden.

Die Klasse »GeometricObject«

Vergleichen wir jetzt Schritt für Schritt die einzelnen Klassenmitglieder von Circle und Rectangle, um daraus ein einheitliches Konzept für den Entwurf des Oberbegriffs GeometricObject zu formulieren.

Instanzvariablen und Eigenschaftsmethoden

Die Lage eines Circle- und Rectangle-Objekts wird durch XCoordinate und YCoordinate beschrieben. Es bietet sich an, diese beiden Eigenschaften in die gemeinsame Basisklasse auszulagern.


// Felder
public int XCoordinate { get; set; }
public int YCoordinate { get; set; }

Konstruktoren

Da sich Konstruktoren nicht an die abgeleiteten Klassen vererben, bleiben die Erstellungsroutinen in Circle und Rectangle unverändert. Ein eigener Konstruktor in GeometricObject ist nicht notwendig, weder der parameterlose noch ein parametrisierter.

Instanzmethoden

Widmen wir uns zunächst den Methoden GetArea und GetCircumference. Wir wollen die Methoden zur Flächen- und Umfangsberechnung in jeder Subklasse garantieren, aber die Implementierung unterscheidet sich abhängig vom geometrischen Objekttyp grundlegend. GetArea und GetCircumference können in GeometricObject deklariert werden, müssen aber abstrakt sein. Infolgedessen muss auch GeometricObject als abstract gekennzeichnet werden.


public abstract double GetArea();
public abstract double GetCircumference();

Ein Vergleich hinsichtlich der Instanzmethoden beider Klassen führt zu der Erkenntnis, dass beide die gleichnamige überladene Methode Bigger veröffentlichen, die zwei Objekte miteinander vergleicht und einen Integer als Rückgabewert liefert.

Aus logischer Sicht leistet diese Methode sowohl in Circle als auch in Rectangle dasselbe und unterscheidet sich nur im Parametertyp: Die Bigger-Methode in der Circle-Klasse nimmt die Referenz auf ein Circle-Objekt entgegen, und in der Klasse Rectangle nimmt sie die Referenz auf ein Rectangle-Objekt entgegen. Wir können uns den Umstand zunutze machen, dass sowohl die Circle- als auch die Rectangle-Klasse aus derselben Basisklasse abgeleitet werden, und müssen dazu nur den Typ des Parameters und der Rückgabe entsprechend in GeometricObject ändern. Als Nebeneffekt beschert uns diese Verallgemeinerung, dass wir nun in der Lage sind, die Flächen von zwei verschiedenen Typen zu vergleichen, denn nun kann die Bigger-Methode auf einer Circle-Referenz aufgerufen und als Argument die Referenz auf ein Rectangle-Objekt übergeben werden.


public virtual int Bigger(GeometricObject rect) {
  if (GetArea() < rect.GetArea())
    return -1;
  else if (GetArea() == rect.GetArea())
    return 0;
  else
    return 1;
}

In der Methode wird zum Vergleich die Methode GetArea herangezogen. Da wir sie als abstrakte Methode in der Basisklasse deklariert haben, erfolgt der Aufruf polymorph. Zudem sollten wir Bigger auch als virtuelle Methode bereitstellen. Damit ermöglichen wir den Subklassen, eine unter Umständen andere Implementierung unter Gewährleistung der Polymorphie zu codieren.

Die zweifach parametrisierte Methode MoveXY kann ebenfalls in GeometricObject implementiert werden, während die Überladung (in Circle mit drei und in Rectangle mit vier Parametern) kein Kandidat ist. Auch diese Methode wird mit dem Modifizierer virtual signiert.


public virtual void MoveXY(int dx, int dy) {
  XCoordinate += dx;
  YCoordinate += dy;
}

Die Klassenmethoden

Die Argumentation, die uns dazu brachte, die Instanzmethode Bigger in der Basisklasse zu codieren, gilt auch bei der gleichnamigen Klassenmethode. Wir müssen jeweils nur den Typ des Parameters ändern.


public static int Bigger(GeometricObject geoObj1, GeometricObject geoObj2) {
  if (geoObj1.GetArea() < geoObj2.GetArea())
    return -1;
  else if (geoObj1.GetArea() == geoObj2.GetArea())
    return 0;
  else
    return 1;
}

Der Objektzähler

Aus den allgemeinen Betrachtungen der objektorientierten Programmierung fällt der Objektzähler grundsätzlich zunächst einmal heraus. Hier hängt es von den Anforderungen an die Anwendung ab, ob ein gemeinsamer Objektzähler für alle geometrischen Objekte den Forderungen genügt oder ob Circle- und Rectangle-Objekte separat gezählt werden sollen. Darüber hinaus könnte man sich auch vorstellen, beide denkbaren Zählervarianten bereitzustellen. So wird es auch im Beispielcode gelöst.

Um einen gemeinsamen Objektzähler in GeometricObject zu realisieren, muss der Klasse ein Konstruktor hinzugefügt werden, der für die Aktualisierung des Zählers sorgt. Hier kommt uns zugute, dass bei der Instanziierung einer abgeleiteten Klasse die Konstruktorverkettung dafür sorgt, dass der Konstruktor der Basisklasse aufgerufen wird.


public abstract class GeometricObject {
  // statisches Feld
  private static int _CountGeometricObjects;
  public static int CountGeometricObjects {
    get { return _CountGeometricObjects; }
  }
  // Konstruktor
  protected GeometricObject()
  {
    _CountGeometricObjects++;
  }
  ...
}

Änderungen in den Klassen »Circle« und »Rectangle«

Zum Schluss sollten wir auch noch einen Blick in die Klassen Circle und Rectangle werfen. Nach den entsprechenden Änderungen aufgrund der Ableitung von GeometricObject sollten wir in Circle die Eigenschaftsmethode Radius und die Überladung von MoveXY noch als virtual kennzeichnen. Analog wird auch in Rectangle mit Width, Length und der Überladung von MoveXY verfahren.


Hinweis

Sie finden die vollständige Zusammenfassung des Codes zu diesem Beispiel auf der Buch-CD unter Beispiele\Kapitel 4\GeometricObjectsSolution_2.




Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2010

Visual C# 2010
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2010
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern