Vererbung |
|
|
-
Gleichbedeutende Bezeichnungen für diese Beziehung:
-
Vererbung / Inheritance
-
Generalisierung / Generalization
-
Spezialisierung / Specialization
|
|
-
Eine Klasse A vererbt ihr Verhalten und/oder ihre
Struktur an die Kinder B.
-
A wird bezeichnet als:
-
superclass
-
parent
-
ancestor
-
B wird bezeichnet als
-
supclass
-
child / Kind
-
descendent
|
|
|
-
Die public und protected deklarierten Methoden und
Attribute der Superklasse werden an die Kindklassen vererbt. D.h. diese
stehen dort zur Verfügung und können verwendet werden.
-
Beziehungen der SuperClass werden ebenfalls vererbt.
Insbesondere kann die SuperClass selbst Kindklasse einer anderen SuperClass
sein.
-
Private Methoden/Attribute werden nicht vererbt.
Diese stehen weiterhin nur Methoden der Superklasse zur Verfügung.
-
Im Beispiel:
-
m1() wird nicht vererbt, da private;
-
m2() wird vererbt;
-
Child1 erweitert die Funktionalität um die Methode
void m3().
-
Child1 hat also die Methoden m3() und m2().
-
Kind2 definiert die Methode m2() neu (redefine).
Die neue m2() Methode kann erweitere Funktionalität oder gänzlich
veränderte Funktionalität aufweisen.
-
Kind2 kann die Methode m2() aus der Superklasse weiterhin
verwenden (super.m2() in Java).
|
void demo(SuperClass abc) {
return( abc.m2() );
}
....
Kind2 k = new Kind2();
demo(k);
|
|
-
Wo immer Objekte der Superklasse erwartet werden,
können auch Objekte der Kindklassen angegeben werden.
-
Wo Kindklassen erwartet werden kann jedoch nicht
die SuperKlasse verwendet werden.
-
Die Methode demo() wird hier die neu definierte Methode
m2() aus Kind2 aufrufen. (Also nicht m2() der Superklasse!)
-
Achtung: Die
C++ Implementierung weicht hier von der JAVA Implementierung ab. Bei C++
wird m2() der Superklasse aufgerufen!
|
Achtung:
UML bietet keinen Schutz gegenüber unlogischer
Modellierung. Dies muss von den Autoren des Modells überprüft
werden!
|
|
ist ein ... / is kind of
-
Eine sinnvolle Vererbungsbeziehung kann überprüft werden, indem
die "ist ein" Beziehung überprüft wird.
-
Beispiel: Superclass Fahrzeug, Child Auto, Child Rad.
-
Ein Auto ist ein
Fahrzeug.
-
Jedoch: Ein Rad ist kein Fahrzeug. Rad kann eine andere Beziehung
zu Fahrzeug oder Auto haben (Association, Dependency), eine Vererbungsbeziehung
ist hier jedoch unlogisch.
|
multiple inheritance
|
|
-
Hat ein Child mehrere Superklassen, so spricht man
von Mehrfachvererbung.
-
Diese kann jedoch zu Inkonsistenz führen und
wird von Java nicht unterstützt.(Lösung dafür siehe Interfaces)
-
Mehrfachvererbung kann nützlich sein um das
Modell darzulegen, sollte jedoch vermieden werden.
|
Inheritance vs Generalization (für Insider)
|
|
-
Generalization ist der Name der Beziehung zwischen den Klassen.
-
Inheritance ist der Mechanismus welcher durch die Generalization-Beziehung
dargestellt wird.
|
|
|