Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-03-2006, 16:43   #1 (permalink)
Neuer User
 
Registriert seit: May 2003
Beiträge: 59
Aufrufen eines Konstruktors per apply???

Hallo!

Versuche schon seit einiger Zeit einen hinzugefügten MovieClip im Nachhein, dynamisch eine neue Klasse zuzuweisen.

Hab ein bisschen herumgestöbert und bin auf diesen Thread von Elias gestossen.
LinkedClip

Irgendwie hab ich das Teil nicht so zum Laufen gebracht, wie ich mir das vorstellte. Object.registerClass hat mir auch nicht weitergeholfen.
Lest euch doch bitte kurz einmal diesen code durch, vielleicht könnt ihr mir ja weiterhelfen...

Lg & Danke
Gernot

PHP-Code:
class MovieClipLinker {
    
    public static function 
createMC(p_class:Function, p_id:Stringp_name:Stringp_depth:Numberp_target:MovieClipp_init) {

        var 
p_target.attachMovie(p_idp_namep_depthp_init);
        
        
// überschreiben
        
o.prototype p_class.prototype;
        
        
// Warum kann ich hier nicht den Konstruktor von Klasse A aufrufen???
        
p_class.apply(o);
        
        
// gibt alles true zurück
        
trace((o.prototype == p_class.prototype) + " ==> gleiche Klasse")
        
trace((o.prototype.__proto__ == ClassB.prototype) + " ==> gleiche SuperKlasse")
        
trace((o.prototype.__proto__.__proto__ == MovieClip.prototype) + " ==> gleiche SuperSuperKlasse")
            
        return 
o;
    }

PHP-Code:
class ClassA extends ClassB {
    
    public function 
ClassA(Void) {
        
// Konstruktor ClassB aufrufen
        
super();
    }

PHP-Code:
class ClassB extends MovieClip {
    
    public function 
ClassB(Void) {
        
super();
        
gotoAndStop(2);
    }
    
    public function 
moveTo(x:Numbery:Number) : Void {
        
this._x x;
        
this._y y;
    }

auf der Zeitleiste im ersten Bild:
PHP-Code:
import MovieClipLinker;
import ClassA;
import ClassB;

var 
mc:ClassA MovieClipLinker.createMC(ClassA"test_mc""abc"1this);
trace(mc instanceof ClassA); // Output: false
mc.moveTo(100200);

/**
Ausgabe:
Globale Variablen:
  Variable _global.MovieClipLinker = [Funktion 'MovieClipLinker']
  Variable _global.ClassB = [Funktion 'ClassB']
  Variable _global.ClassA = [Funktion 'ClassA']
Stufe #0:
Variable _level0.$version = "WIN 8,0,22,0"
Variable _level0.mc = [Movieclip:_level0.abc]
Movieclip: Ziel="_level0.instance1"
Movieclip: Ziel="_level0.abc"
Variable _level0.abc.prototype = [Objekt #4] {}
*/ 
Angehängte Dateien
Dateityp: zip mclMX2004.zip (6,6 KB, 2x aufgerufen)

Geändert von kungfuzius (25-03-2006 um 18:23 Uhr)
kungfuzius ist offline   Mit Zitat antworten
Alt 25-03-2006, 18:43   #2 (permalink)
Neuer User
 
Registriert seit: May 2003
Beiträge: 59
Ooops!!!
Falsche Abteilung und falscher Titel ...
Lieber Moderator verschieb das alles bitte in ActionScript 2 Unterforum, tschuldige, aaarrrghhhh!

Im Titel sollte eigentlich apply stehen nicht call...


Nach weiterem herumexperimentieren bin ich zu folgendem gekommen:

PHP-Code:
        public static function createMC(p_class:Function, p_id:Stringp_name:Stringp_depth:Numberp_target:MovieClipp_init) {

        var 
p_target.attachMovie(p_idp_namep_depth);
        var 
mc o;
        
// Warum kann ich hier nicht den Konstruktor von Klasse A aufrufen???
        // von Elias ...
        
o.__proto__ p_class.prototype;
        
// if we have an init object
        
if(p_init) {
            for (var 
prop:String in p_init) {
                
o[prop] = p_init[prop] ;    
            }
        }
        
        
p_class.apply(o);
        
trace(o// level0.abc
        
return o;
    } 
Der Konstruktor der Klasse A und B wird jedenfalls aufgerufen. Die Methode gibt jedoch undefined zurück. Sollte hier nicht eine Referenz auf die neu zugewiesene Klasse zurückkommen?

Geändert von kungfuzius (25-03-2006 um 19:08 Uhr)
kungfuzius ist offline   Mit Zitat antworten
Alt 25-03-2006, 19:18   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
solche Tricks brauchst du eigentlich nur, wenn du die Klasse eines bestehenden MovieClips ändern möchtest. Ansonsten reicht einfach Object.registerClass.
Wie hast du es denn damit probiert? Vielleicht finden wir ja einen Fehler
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 25-03-2006, 19:41   #4 (permalink)
Neuer User
 
Registriert seit: May 2003
Beiträge: 59
Hi Janoscharlipp
Habs so änhlich wie
PHP-Code:
    public static function createMC(p_class:Function, p_id:Stringp_name:Stringp_depth:Numberp_target:MovieClipp_init) {
        
        
Object.registerClass(p_idp_class)
        return 
p_target.attachMovie(p_idp_namep_depth);
    } 
probiert. Doch so bekomme ich auch nur undefined zurück. Funktioniert nur wenn die Klass A nicht von der Klasse B erbt...

Geändert von kungfuzius (25-03-2006 um 19:44 Uhr)
kungfuzius ist offline   Mit Zitat antworten
Alt 27-03-2006, 07:41   #5 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Das ist sehr seltsam, noch verwirrender ist, dass wenn du die Rückgabe von attachMovie erstmal zwischenspeicherst, und dann ausgibst, eigentlich alles richtig zu sein scheint.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 27-03-2006, 08:32   #6 (permalink)
Neuer User
 
Benutzerbild von K-Grabowski
 
Registriert seit: Jan 2003
Ort: Arminia!!!! Bielefeld
Beiträge: 1.138
Bei mir klappt so alles:


Code:
    class ClassA extends MovieClip {         private var num:Number;         public function ClassA () {         num = 5;     }         }

Code:
    class ClassB extends ClassA {         public function ClassB () {         super();         num += 5;         trace(num); // gibt 10 zurück     }         }

Hauptzeitleiste
Code:
    Object.registerClass("mc", ClassB); var attached:ClassB = this.attachMovie("mc","mc1", 1); trace(attached instanceof ClassA); //true trace(attached instanceof ClassB); //true trace(attached instanceof MovieClip); //true
__________________
Wieviel hätte ich also für dieses Fahrzeug zu investieren???
K-Grabowski ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele