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

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 4 Vererbung, Polymorphie und Interfaces
Pfeil 4.1 Die Vererbung
Pfeil 4.1.1 Basisklassen und abgeleitete Klassen
Pfeil 4.1.2 Die 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 Die 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 Die implizite Typumwandlung von Objektreferenzen
Pfeil 4.3.2 Die 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 Die »klassische« Methodenimplementierung
Pfeil 4.4.2 Abstrakte Methoden
Pfeil 4.4.3 Virtuelle Methoden
Pfeil 4.5 Weitere Gesichtspunkte der Vererbung
Pfeil 4.5.1 Versiegelte Methoden
Pfeil 4.5.2 Überladen einer Basisklassenmethode
Pfeil 4.5.3 Statische Member und Vererbung
Pfeil 4.5.4 Geerbte Methoden ausblenden?
Pfeil 4.6 Das Projekt »GeometricObjectsSolution« ergänzen
Pfeil 4.6.1 Die Klasse »GeometricObject«
Pfeil 4.7 Eingebettete Klassen (Nested Classes)
Pfeil 4.8 Interfaces (Schnittstellen)
Pfeil 4.8.1 Einführung in die Schnittstellen
Pfeil 4.8.2 Die Schnittstellendefinition
Pfeil 4.8.3 Die Schnittstellenimplementierung
Pfeil 4.8.4 Die Interpretation der Schnittstellen
Pfeil 4.8.5 Änderungen am Projekt »GeometricObjects«
Pfeil 4.9 Das Zerstören von Objekten – der »Garbage Collector«
Pfeil 4.9.1 Die Arbeitsweise des Garbage Collectors
Pfeil 4.9.2 Expliziter Aufruf des Garbage Collectors
Pfeil 4.9.3 Der Destruktor
Pfeil 4.9.4 Die »IDisposable«-Schnittstelle
Pfeil 4.9.5 Die Ergänzungen in den Klassen »Circle« und »Rectangle«

Rheinwerk Computing - Zum Seitenanfang

4.6 Das Projekt »GeometricObjectsSolution« ergänzenZur nächsten Überschrift

Wir wollen uns nun noch einmal dem von uns immer weiter entwickelten Beispielprojekt GeometricObjects zuwenden. Wir werden den Entwurf im ersten Schritt um zwei weitere Klassen, nämlich 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.

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


Rheinwerk Computing - Zum Seitenanfang

4.6.1 Die Klasse »GeometricObject«Zur nächsten ÜberschriftZur vorigen Überschrift

Es ist zu erkennen, dass sich die Klassen Rectangle und Circle in vielen Punkten ä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, weil dann nicht zwei unterschiedlich benannte Methoden dasselbe Leistungsmerkmal beschreiben. Nach diesen ersten Überlegungen soll nun die Klasse GeometricObject implementiert werden.

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. Da wir auch berücksichtigen sollten, dass eine zukünftige Ableitung möglicherweise die Eigenschaftsmethoden überschreibt (z. B. um den Bezugspunkt im 4. Quadranten des kartesischen Koordinatensystems zu vermeiden), sollten wir die Eigenschaften virtual signieren.

// Eigenschaften
public virtual double XCoordinate { get; set; }
public virtual double YCoordinate { get; set; }

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

Die Instanzmethoden

Widmen wir uns zunächst den Methoden GetArea und GetCircumference. Wir wollen die Methoden zur Flächen- und Umfangsberechnung in jeder ableitenden Klasse garantieren, aber die Implementierung unterscheidet sich abhängig vom geometrischen Typ grundlegend. GetArea und GetCircumference können in GeometricObject deklariert werden, müssen aber abstrakt sein. Infolgedessen muss auch GeometricObject mit dem Modifizierer 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, in der Klasse Rectangle die Referenz auf ein Rectangle-Objekt. Wir können uns den Umstand zunutze machen, dass sowohl die Circle- als auch die Rectangle-Klasse nunmehr 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 @object) {
if (@object == null || GetArea() > @object.GetArea()) return 1;
if (GetArea() < @object.GetArea()) return -1;
return 0;
}

Listing 4.25 Anpassung der Implementierung der Methode »Bigger« in der Basisklasse

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 ableitenden Klassen, eine unter Umständen andere Implementierung unter Gewährleistung der Polymorphie zu implementieren.

Die zweifach parametrisierte Methode Move 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 Move(double dx, double 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 object1, GeometricObject object2) {
if (object1 == null || object2 == null) return 0;
if (object1 == null) return -1;
if (object2 == null) return 1;
if (object1.GetArea() > object2.GetArea()) return 1;
if (object1.GetArea() < object2.GetArea()) return -1;
return 0;
}

Listing 4.26 Anpassung der statischen Methode »Bigger« in der Basisklasse

Der Objektzähler

Aus den allgemeinen Betrachtungen der objektorientierten Programmierung fällt der Objektzähler grundsätzlich zunächst einmal heraus. Hier sind es die Anforderungen an die Anwendung, 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 in unserem Beispiel 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 {
// Statische Eigenschaft
private static int _CountGeometricObjects;
public static int CountGeometricObjects {
get { return _CountGeometricObjects; }
}
// Konstruktor
protected GeometricObject() {
_CountGeometricObjects++;
}
[...]
}

Listing 4.27 Objektzähler in der Basisklasse »GeometricObject«

Ä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 Move noch virtual kennzeichnen. Analog wird auch in Rectangle mit Width, Length und der Überladung von Move verfahren.

Unter dem Gesichtspunkt, die Draw-Methode in GraphicCircle und GraphicRectangle polymorph anzubieten, erhalten beide Implementierungen ebenfalls den virtual-Modifizierer.

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



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.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual C# 2012

Visual C# 2012
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: C/C++






 C/C++


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
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