2010-07-15 2 views
3
A.as : 

    public class A { 

    public function getFunction():Function { 
     return function():void { 
     if(this is C) { 
      trace("C"); 
     } else { 
      trace("not C"); 
     } 
    } 
    } 


public function func1():void { 
    var internalFunc:Function = getFunction(); 
    internalFunc(); 
} 

} 

B.as : 
public class B extends A implements C { 

} 

Dans une autre classe:POO Comprendre en Actionscript

var b:B = new B(); 
    B.func1(); 

sortie est: "Non C"

Je me attendais à la sortie de trace être
"C"

Quelqu'un peut-il expliquer pourquoi?

Répondre

5

Un anonymous function, s'il est appelé directement, est étendu à l'objet global . Si vous tracez this à l'intérieur, vous verrez [object global] au lieu de [object B], comme vous le feriez si cela faisait référence à b.

Une solution commune utilise une fermeture:

var self:A = this; 
    return function():void { 
    if(self is C) { 
     trace("C"); 
    } else { 
     trace("not C"); 
    } 
} 

S'il vous plaît noter cependant, l'instance membres d'une classe définissant une fonction anonyme sont disponibles à l'intérieur. Cela fonctionne, car ils sont résolus au moment de la compilation.

modifier en réponse à la question de Amarghosh:

Oui, this pointe vers l'objet global, mais cela ne signifie pas, vous ne pouvez pas accéder aux membres d'instance de la classe déclarant. Ce petit morceau de code devrait expliquer les détails:

package { 
import flash.display.Sprite; 
public class Test extends Sprite { 
    private var foo:String = "foo"; 
    public function Test() { 
    var anonymous:Function = function():void { 
    trace(foo);//foo 
    trace(this.foo);//undefined 
    }; 
    anonymous(); 
    } 
} 
} 

greetz
back2dos

+0

Son exemple de code n'a pas de fonction anonyme, cependant. Voici un bon article sur les fonctions anonymes dans Flex: http://www.darronschall.com/weblog/2004/08/anonymous-inline-and-named-functions-in-actionscript.cfm – JeffryHouser

+0

Les membres d'instance seront disponibles seulement si vous assignez 'this' à une variable locale dans la fonction englobante, non? Sinon, avec 'this' pointant vers global, que feriez-vous pour s'y référer? – Amarghosh

+0

@ www.Flextras.com: Voir le commentaire d'Amarghosh à votre réponse. – back2dos

1

Quelques choses avec le code que je suppose ne sont que quelques fautes de frappe?

La méthode getFunction() ne renvoie rien et provoque donc une erreur de compilation.
Votre code d'appel appelle func1() en tant que méthode statique, pas en tant que méthode sur une instance de la B. Cela entraînera également une erreur de compilation. Je crois que ce sont des fautes de frappe.

Dans mes tests, en utilisant votre code modifié. La sortie est C. Il doit y avoir quelque chose d'autre qui se passe avec votre code. Voici mes mods à A:

public function getFunction():Function { 
     if(this is C) { 
      trace("C"); 
     } else { 
      trace("not C"); 
     } 
     return getFunction; 
    } 

Voici mon mod au code exécutable, que je mets dans creationComplete d'un fichier d'application MXML vide:

  var b:B = new B(); 
      b.func1(); 

Je suppose que votre code "monde réel" est plus vaste que l'échantillon et il doit y avoir quelque chose d'autre qui se passe.

+2

Il retourne une fonction anonyme de 'getFunction' et l'appelle de' func1' - 'this' sera' global' comme suggéré par back2dos – Amarghosh

+0

Je dois avoir copié et collé son code de façon incorrecte quand j'ai essayé de l'exécuter; car la fonction getFunction ne renvoyait rien. – JeffryHouser

+0

@ flextras.com, vous ne l'avez pas copié incorrectement :-). J'avais édité mon code après l'avoir posté pour la première fois .. – dharm0us