Unvollständige Vererbung von Konstruktoren
Juten Tach,
wieder mal so ein Tag, an dem …
Folgendes kleine Beispiel sei gegeben:
Wir schreiben eine Klasse ‘Superklasse’, in der steht folgendes:
class Superklasse {
private var name:String = "Superklasse";
public function Superklasse(msg:String) {
trace("Konstruktor von " + name + " spuckt: " + msg);
}
}
Und wir schreiben noch eine Klasse ‘Unterklasse’, in der soll folgendes stehen:
class Unterklasse extends Superklasse {
private var name:String = "Unterklasse";
}
So, jetzt erstellen wir eine .fla und schreiben im ersten Frame einfach folgendes:
var testchen:Unterklasse = new Unterklasse("Hallo");
var testchen:Superklasse = new Superklasse("Hallo");
So und nun mal raten, was kommt raus?
Konstruktor von Unterklasse spuckt: undefined Konstruktor von Superklasse spuckt: Hallo
Was sagt uns das? Das fehlen des Konstruktors in der Unterklasse bewirkt zwar wie gewünscht, dass der Konstruktor der Superklasse verwendet wird, wegen Vererbung und so, aber der Parameter kommt nicht mit. Kann mir das einer erklären?
Umgehen lässt sich das Problem nur, indem man einen super() enthaltenden Konstuktor implementiert:
class Unterklasse extends Superklasse {
private var name:String = "Unterklasse";
public function Unterklasse(msg:String) {
super(msg);
}
}
Dann kommt auch der Parameter durch. Ach ja, Flash …


der grund für das verhalten liegt darin, daß as2 keine objektorientierte, sondern vielmehr eine prototypen orientierte sprache ist. objektorientierte prinzipien und ausdrücke wurden lediglich auf as1 draufgeflanscht.
der as2 code der beiden beispieldateien (Unterklasse.as, Superklasse.as) wird letztendlich in diesen code runterkompiliert…
Superklasse.as:
#initclip
if (!_global.Superklasse) {
var _local1 = function (msg) {
trace (((“Konstruktor von ” + this.name) + ” spuckt: “) + msg);
};
_global.Superklasse = _local1;
var _local2 = _local1.prototype;
_local2.name = “Superklasse”;
(ASSetPropFlags(_global.Superklasse.prototype, null, 1));// not popped
}
#endinitclip
Unterklasse.as:
#initclip
if (!_global.Unterklasse) {
var _local1 = function () {
super();
};
_global.Unterklasse = _local1;
//_global.Unterklasse extends Superklasse
var _local2 = _local1.prototype;
_local2.name = “Unterklasse”;
(ASSetPropFlags(_global.Unterklasse.prototype, null, 1));// not popped
}
#endinitclip
bei fehlendem konstruktur wird also lediglich ‘super();’ aufgerufen.
bleibt nur zu hoffen, daß irgendwann as3 eine richtige objektorientierte sprache wird; aus gründen der backward compatibility bezweifel ich das jedoch…