Wenn du denn Kontruktor in der erweiterten Klasse überschreibst, wird der von der Basisklasse nicht mehr ausgeführt.
Nein. In jeder mir bekannten OO Sprache mit Vererbung werden grundsätzlich die Konstruktoren der Klassen von denen geerbt wird beim Aufruf eines Konstruktors der erbenden Klasse aufgerufen. Das macht auch Sinn, weil ein Objekt der erbenden Klasse in einer isA-Beziehung zur Klasse von der die erbende Klasse erbt steht.
Und das ist ein grundlegender Unterschied im Verhalten von Konstruktoren im Gegensatz normalen Methoden.
Ich seh die Implementierung in LotusScript hier auch nicht als Workaround, sondern als konsistent zu grundlegenden OO-Prinzipien.
Beispiel:
Die Klasse Hund erbt von Säugetier
Jedes Säugetier (also auch Hund) hat ein property blutTemperatur.
Das property blutTemperatur soll während der ganzen Lebenszeit des Objektes einen sinnvollen Wert haben.
Also legt der Entwickler fest, dass es im Konstruktor von Säugetier gesetzt wird.
In Java Syntax
class Säugetier {
private double blutTemp;
// Konstruktor
public Säugetier(int blutTemp) {
this.blutTemp = blutTemp;
}
public double getBlutTemp() {
return blutTemp;
}
}
class Hund extends Säugetier {
private int bellenLautstärke;
public Hund(double blutTemp, bellenLautstärke) {
super(blutTemp);
this.bellenLautstärke = bellenLautstärke;
}
public getBellenLautstärke() {
return bellenLautstärke;
}
}
In konstruktoren werden bestimmte properties gesetzt, die zum state des Objektes gehören.
Der Hund ist ein Säugetier. Also muß hier konkret auch der Wert blutTemp gesetzt sein.
Ein konsistenter state wird am einfachsten dadurch gewährleistet, dass Konstruktoren der Klassen der gesamten Vererbungshierarchie aufgerufen werden und so ist das auch in der Praxis.
Ohne den super(blutTemperatur) im Hund-Konstruktor würde das in Java nicht kompilieren und zwar mit einer ähnlichen Fehlermeldung wie LotusScript. Manchmal ist kein super()-Aufruf da. Dann wird vom Java-Kompiler automatisch das statement super() eingesetzt, ohne dass man das sieht. Es bedeutet, dass ein Konstruktor ohne Parameter der Klassen von der geerbt wird aufgerufen wird. Der ist aber in Säugetier nicht vorhanden.
Manche Klassen haben überhaupt keinen sichtbaren Konstruktor. Da fügt der KOmpiler dann aber einen impliziten leeren Konstruktor ohne Argumente ein. Sobald eine Klasse irgendeinen Konstruktor hat, muss dieser parameterlose Konstruktor explizit im Code vorhanden sein.