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

 <<   zurück
Visual Basic 2005 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual Basic 2005

Visual Basic 2005
1.233 S., mit 2 CDs, 59,90 Euro
Rheinwerk Computing
ISBN 3-89842-585-1
gp Kapitel 6 Vererbung, Polymorphie und Schnittstellen
  gp 6.1 Basisklassen und abgeleitete Klassen
    gp 6.1.1 Die Ableitung einer Klasse
    gp 6.1.2 Klassen, die nicht vererben können
    gp 6.1.3 Zusammenfassung
  gp 6.2 Konstruktoren in abgeleiteten Klassen
    gp 6.2.1 Allgemeines
    gp 6.2.2 Die Konstruktoren der Klasse »GraphicCircle«
    gp 6.2.3 Der Zugriffsmodifizierer »Protected«
    gp 6.2.4 Konstruktorverkettung
    gp 6.2.5 Finalizer-Verkettung
    gp 6.2.6 Zusammenfassung
    gp 6.2.7 Der Stand des Projekts »CircleApplication«
  gp 6.3 Die Methoden in einer abgeleiteten Klasse
    gp 6.3.1 Geerbte Methoden mit »Shadows« verdecken
    gp 6.3.2 Überladen einer Basisklassenmethode
  gp 6.4 Ereignisse in der Vererbung
  gp 6.5 »Hat-eine«-Beziehungen (Aggregation)
    gp 6.5.1 Weiterleitung einer internen Objektreferenz
    gp 6.5.2 Verbergen des internen Objekts
    gp 6.5.3 Innere Klassen
  gp 6.6 Typumwandlung von Objektvariablen
    gp 6.6.1 Die implizite Typumwandlung von Objektreferenzen
    gp 6.6.2 Die explizite Typumwandlung von Objektreferenzen
    gp 6.6.3 Zusammenfassung
  gp 6.7 Abstrakte Klassen und Methoden
    gp 6.7.1 Problembeschreibung
    gp 6.7.2 Abstrakte Definitionen
  gp 6.8 Polymorphie
    gp 6.8.1 Überschreibbare Methoden mit »Overridable«
    gp 6.8.2 Inhomogene Mengen
    gp 6.8.3 Verdecken und Überschreiben geerbter Methoden
    gp 6.8.4 Überschreiben der Methode »ToString()« der Klasse »Object«
    gp 6.8.5 Nicht überschreibbare Methoden
    gp 6.8.6 Die Referenzen »Me«, »MyBase« und »MyClass«
    gp 6.8.7 Zusammenfassung
  gp 6.9 Erweiterung der Klassenhierarchie »CircleApplication«
    gp 6.9.1 Die Klasse »GeometricObject«
  gp 6.10 Schnittstellen
    gp 6.10.1 Einführung in die Schnittstellen
    gp 6.10.2 Schnittstellendefinition
    gp 6.10.3 Schnittstellenimplementierung
    gp 6.10.4 Abstrakte Klassen vs. Schnittstellen
    gp 6.10.5 Zusammenfassung

Kapitel 6 Vererbung, Polymorphie und Schnittstellen


Galileo Computing

6.1 Basisklassen und abgeleitete Klassen  downtop

Welche Fähigkeit würden Sie von einem Circle-Objekt neben den bereits implementierten noch erwarten? Wahrscheinlich eine ganz wesentliche, nämlich die Fähigkeit, sich in einer beliebigen grafikfähigen Komponente visualisieren zu können. Bisher fehlt dazu noch eine passende Methode.

Die Klasse Circle soll jedoch von uns als abgeschlossen betrachtet werden (zumindest hinsichtlich der Fähigkeiten eines Circle-Objekts). Damit simulieren wir zwei Ausgangssituationen, die in der täglichen Praxis häufig auftreten:

gp  Die Implementierung einer Klasse, wie beispielsweise Circle, ist für viele Anwendungsfälle völlig ausreichend. Eine Erweiterung würde nicht allgemeinen, sondern nur speziellen Zusatzanforderungen genügen.
gp  Eine Klasse wird als Kompilat bereitgestellt. Damit besteht auch keine Möglichkeit, direkt die Klassenimplementierung um weitere Fähigkeiten zu ergänzen. Wie kann das Problem gelöst werden, eine Klasse um zusätzliche Fähigkeiten zu erweitern, damit sie weitergehenden Anforderungen gewachsen ist?

Die Antwort ist sehr einfach und lautet: Es muss eine weitere Klasse entwickelt werden. Diese soll GraphicCircle heißen und einerseits alle Fähigkeiten der Klasse Circle veröffentlichen und darüber hinaus auch noch eine Methode namens Draw, damit das Objekt gezeichnet werden kann. Mit der Vererbung, einem der Stützpfeiler der objektorientierten Programmierung, ist die Lösung sehr einfach zu realisieren.


Das Grundprinzip der Vererbung ist, Methoden und Eigenschaften einer existierenden Klasse wiederzuverwenden und weitere hinzuzufügen.


Eine Klasse, die ihre Member als Erbgut einer abgeleiteten Klasse zur Verfügung stellt, wird als Basis- oder Superklasse bezeichnet. Die erbende Klasse ist die Sub- oder einfach nur die abgeleitete Klasse. Dem Grundprinzip der Vererbung folgend verfügen Subklassen normalerweise über mehr Funktionalitäten als ihre Basisklassen. Im Einzelfall muss überprüft werden, ob sich die Vererbung für die benutzerdefinierten Klassen einer Anwendung eignet.

Werden zwei Klassen, die miteinander in einer Vererbungsbeziehung stehen, grafisch dargestellt, wird – wie in Abbildung 6.1 – der Beziehungspfeil von der abgeleiteten in Richtung der beerbten Klasse gezeichnet.

Die Vererbung muss nicht mit dem Ableiten einer Klasse aus einer Basisklasse aufhören. Eine Subklasse kann ihrerseits selbst wieder als Basisklasse für weitere abgeleitete Klassen dienen. Aus einer Basisklasse können auch mehrere Subklassen abgeleitet werden, die dann allerdings untereinander beziehungslos sind. Am Ende kann dadurch eine nahezu beliebig tiefe und weit verzweigte Vererbungshierarchie entstehen, die einer Baumstruktur ähnelt. Die .NET-Klassenbibliothek mit der an der Spitze stehenden Basisklasse Object ist das für uns aktuelle Paradebeispiel einer solchen Klassenhierarchie.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 6.1     Die Vererbungsbeziehung zwischen den Klassen »Circle« und »GraphicCircle«

Grundsätzlich wird in der Objektorientierung zwischen einfacher Vererbung und Mehrfachvererbung unterschieden. Bei der einfachen Vererbung kann eine Klasse nur aus einer direkten Basisklasse abgeleitet werden, bei der Mehrfachvererbung können es mehrere sein. Eine Klassenhierarchie, die auf Mehrfachvererbung basiert, ist schwierig zu entwickeln und kann im schlimmsten Fall zu unerwarteten Nebeneffekten führen. Um Konflikten dieser Art aus dem Weg zu gehen, wird die Mehrfachvererbung von .NET nicht unterstützt. Damit werden bewusst Einschränkungen in Kauf genommen, die aber durch die Schnittstellentechnologie nahezu gleichwertig ersetzt werden (siehe Abschnitt 6.10).


Galileo Computing

6.1.1 Die Ableitung einer Klasse  downtop

Wenden wir uns nun wieder unserem Beispiel zu und ergänzen das Projekt CircleApplication um die Klasse GraphicCircle, welche die Basisklasse Circle beerben soll. Sie können GraphicCircle in einer neuen Quellcodedatei implementieren oder in der, die schon die Klasse Circle enthält. Die bessere Übersicht bei der Codeverwaltung spricht vielleicht eher für eine eigene Datei.

GraphicCircle soll aus Circle abgeleitet und durch die typspezifische Methode Draw erweitert werden. Die Ableitung wird in der neuen Klassendefinition durch die Anweisung Inherits mit Angabe der Basisklasse zum Ausdruck gebracht:


Public Class GraphicCircle
Inherits Circle
Public Sub Draw()
Console.WriteLine("Der kreis wird gezeichnet.")
End Sub
End Class

Wir wollen an dieser Stelle das Kreisobjekt nicht wirklich zeichnen, sondern nur stellvertretend eine Zeichenfolge an der Konsole ausgeben.

Die Konsequenz der Vererbung können Sie zu diesem Zeitpunkt bereits sehen, wenn Sie ein Objekt des Typs GraphicCircle mit


Dim gc As GraphicCircle = New GraphicCircle()

erzeugen und anschließend die Punktnotation auf den Objektverweis anwenden: Es werden in der Intellisense-Liste neben der neuen Methode Draw alle öffentlichen Mitglieder der Klasse Circle angezeigt, obwohl diese in der abgeleiteten Klasse nicht definiert sind (siehe Abbildung 6.2).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 6.2     Die von der Klasse »Circle« geerbten Fähigkeiten

Die Tatsache, dass ein Objekt vom Typ GraphicCircle alle Komponenten der Klasse Circle offen legt, lässt unweigerlich den Schluss zu, dass das Objekt einer abgeleiteten Klasse gleichzeitig auch ein Objekt der Basisklasse sein muss. Zwischen den beiden in der Vererbungshierarchie in Beziehung stehenden Klassen existiert eine Beziehung, die als Ist-ein(e)-Beziehung bezeichnet wird.


Ein Objekt vom Typ einer abgeleiteten Klasse ist gleichzeitig auch immer ein Objekt vom Typ seiner Basisklasse.


Betrachten Sie zur Verdeutlichung noch einmal Abbildung 4.2. Aus der Basisklasse Luftfahrzeug werden die Klassen Hubschrauber, Starrflügler und Zeppelin abgeleitet. Sie können sicher der Behauptung zustimmen, dass ein Zeppelin ein Luftfahrzeug ist. Der Behauptung, dass ein Luftfahrzeug grundsätzlich ein Hubschrauber ist, müssten Sie aber widersprechen, denn es könnte sich auch um einen Starrflügler oder um einen Zeppelin handeln.


Galileo Computing

6.1.2 Klassen, die nicht vererben können  downtop

Klassen, die abgeleitet werden, vererben ihren Subklassen alle Eigenschaften und Methoden. Es kommt aber immer wieder vor, dass die weitere Ableitung einer Klasse keinen Sinn macht oder sogar vermieden werden muss, weil die von der Klasse zur Verfügung gestellten Dienste als endgültig betrachtet werden können. Typischerweise gehören hierzu Klassen, die nur statische Methoden veröffentlichen. Stellvertretend für viele andere sei an dieser Stelle die Klasse Math der .NET-Klassenbibliothek genannt.

Um sicherzustellen, dass eine Klasse nicht weiter abgeleitet werden kann, wird in der Klassendefinition der Modifizierer NotInheritable angegeben:


Public NotInheritable Class ClassA
' Anweisungen
End Class

Nicht ableitbare Klassen werden auch als versiegelte Klassen bezeichnet. Der Versuch, die Klasse ClassA abzuleiten, wird zu einer Fehlermeldung führen. Strukturen, die per Definition nicht beerbt werden können, sind implizit versiegelt.


Galileo Computing

6.1.3 Zusammenfassung  toptop

gp  Eine Klasse, die ihr Verhalten anderen Klassen vererbt, wird als Basisklasse bezeichnet, die erbenden Klassen sind die Sub- oder abgeleiteten Klassen. Zwischen einer Basisklasse und der daraus abgeleiteten Klasse besteht eine Ist-ein-Beziehung.
gp  .NET unterstützt nur die Einfachvererbung, nach der eine Klasse nur eine direkte Basisklasse haben kann.
gp  Abgeleitet wird eine Klasse, indem hinter dem Klassenbezeichner in einer neuen Anweisungszeile das Schlüsselwort Inherits gefolgt vom Bezeichner der Basisklasse angegeben wird.
gp  Grundsätzlich sind alle Klassendefinitionen ableitbar. Eine Ausnahme bilden die Klassen, die mit NotInheritable als nicht ableitbar definiert sind. Eine nicht ableitbare Klasse kann niemals eine Basisklasse sein.
 <<   zurück
  
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Visual Basic 2012






 Visual Basic 2012


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





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


[Rheinwerk Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de