|
Mit Hilfe von Vererbung kann aus zwei oder mehreren Datentypen (Klassen) ein Summendatentyp, repräsentiert durch eine Klassenhierarchie, konstruiert werden.
|
|
zur Modellierung von ist-ein-Beziehungen |
| gemeinsame Eigenschaften einer Menge von Objekten werden in einer abstrakten Basisklasse zusammengefasst | |
| alle objektspezifischen Daten und Methoden kommen in konkrete Unterklassen |
|
eine abstrakte Klasse und zwei konkrete Unterklassen abstract
public
class Shape {
abstract
public
double area();
}
die 1. konkrete Unterklasse class Square
extends Shape {
private
double size;
public
double area() {
return
size * size;
}
}
die 2. konkrete Unterklasse class Circle
extends Shape {
private
double r;
public
double area() {
return
Math.PI * r * r;
}
}
|
|
unabhängig von der konkreten Ausprägung der Objekte Shape [] sl;
...
{
double covered = 0.0;
for (a : sl) {
covered += a.area();
}
... ;
}
|
| Dieses Art der Verarbeitung basiert auf dem dynamischen Binden. | |
|
Verarbeitung von Exemplaren aus unterschiedlichen Klassen
mit den gleichen Methoden. Häufig angewendet in Container-Klassen. |
|
|
Grund: Einheitliche, in der Basisklasse festgelegte, Schnittstelle. |
|
| Einfachstes interessantes Beispiel: Verkettete Listen |
|
Zur Unterscheidung der Werte eines Summendatentyps gibt es die Möglichkeit, zur Laufzeit zu erfragen, von welchem Typ ein Objekt ist. Shape s = ...;
if (s instanceof Square) { ... }
if (s instanceof Circle) { ... }
Typisches Code-Muster Shape s;
if (s instanceof Square) {
Square sq = (Square)s;
// Verwendung von Square spezifischen
// Methoden und Variablen
... sq ...
}
|
| keine (Mehrweg-) Verzweigungen über instanceof
Typabfragen, dieses widerspricht dem OO-Ansatz. |
|
| Modulare Erweiterbarkeit würde dadurch verhindert werden. |
| Letzte Änderung: 23.05.2011 | © Prof. Dr. Uwe Schmidt |