Skip to content

Unvollständige Vererbung von Konstruktoren

2005 June 29
by Sven Busse

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 …

Share this:
  • email
  • Twitter
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Posterous
  • Digg
  • Technorati
  • Slashdot
  • Suggest to Techmeme via Twitter
  • StumbleUpon
  • Reddit
  • Netvibes
  • LinkedIn
  • Mixx
One Response leave one →
  1. August 15, 2005

    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…

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS