• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 16-03-2010, 11:50   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2010
Beiträge: 108
this-Referenz in anonymen Methoden

Hallo,

gibt es eine elegante Variante auf die this-Referenz in einer anonymen Methode zuzugreifen? Zum Beispiel:
ActionScript:
  1. public interface MyInterface
  2. {
  3.     ...
  4. }
ActionScript:
  1. public final class MyCheckBox
  2. extends CheckBox
  3. implements MyInterface
  4. {
  5.     public function MyCheckBox()
  6.     {
  7.         super();
  8.     }
  9.  
  10.     public function registerFunction( pFunction:Function ) : void
  11.     {
  12.         addEventListener( Event.CHANGE, function( pEvent:Event = null ) : void
  13.             {
  14.                 if ( pFunction != null )
  15.                 {
  16.                     pFunction( this as MyInterface );
  17.                 }
  18.             } );
  19.     }
  20. }
In Zeile 15 wird so immer null übergeben, weil this nicht die Checkbox ist, sondern global. Oder bleibt in diesem Fall nur pEvent.target as MyInterface?
Szdnez ist offline   Mit Zitat antworten
Alt 16-03-2010, 12:19   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Anonyme Funktionen sind nicht im namespace der Klasse registriert, sondern im anonymen namespace. Das heisst, die Funktion kennt ihre Umgebung - die Klasse - nicht. Das Binding der Funktion an die Klasse wird durch ein Closure implementiert. So kann die Funktion überhaupt erst von dem Dispatcher als "eigene" Methode verwendet werden.

Dein Problem ist, dass der Scope der Funktion nicht, wie augenscheinlich, die Funktion in der sie definiert wurde ist, sondern wie gesagt anonym ist. Ein bessere Implementierung wäre:
ActionScript:
  1. package
  2. {
  3.     import flash.events.Event;
  4.  
  5.     import mx.controls.CheckBox;
  6.  
  7.     public class SuperCheckBox extends CheckBox
  8.     {
  9.  
  10.         private var _newFunction:Function;
  11.  
  12.         public function get newFunction():Function
  13.         {
  14.             return _newFunction;
  15.         }
  16.  
  17.         public function set newFunction(value:Function):void
  18.         {
  19.             _newFunction = value;
  20.         }
  21.  
  22.         public function SuperCheckBox()
  23.         {
  24.             super();
  25.  
  26.             addEventListener(Event.CHANGE, function(event:Event):void
  27.             {
  28.                var checkBox:SuperCheckBox = SuperCheckBox(event.target);
  29.                if (checkBox.newFunction != null)
  30.                {
  31.                    checkBox.newFunction(checkBox);
  32.                }
  33.             });
  34.         }
  35.     }
  36. }
Wobei ich eher mich frage, wieso du nicht einfach den Eventhandler dort implementierst, wo es passieren soll?
ActionScript:
  1. package
  2. {
  3.  
  4.     import flash.events.Event;
  5.  
  6.     import mx.controls.CheckBox;
  7.  
  8.     public class CheckBoxStrategy {
  9.  
  10.         private var _checkBox:CheckBox;
  11.  
  12.         public function get checkBox():CheckBox
  13.         {
  14.             return _checkBox;
  15.         }
  16.  
  17.         public function set checkBox(value:CheckBox):void
  18.         {
  19.             if (_checkBox)
  20.             {
  21.                 _checkBox.removeEventListener(Event.CHANGE, checkBox_changeHandler)
  22.             }
  23.  
  24.             _checkBox = value;
  25.  
  26.             if (_checkBox)
  27.             {
  28.                 _checkBox.addEventListener(Event.CHANGE, checkBox_changeHandler);
  29.             }
  30.         }
  31.  
  32.         private function checkBox_changeHandler(event:Event):void
  33.         {
  34.             var checkBox:CheckBox = CheckBox(event.target);
  35.  
  36.             handleCheckBoxChangeEvent(checkBox);
  37.         }
  38.  
  39.         private function handleCheckBoxChangeEvent(checkBox:CheckBox):void
  40.         {
  41.             /*
  42.              * Some magic...
  43.              */
  44.         }
  45.     }
  46. }
und die ungarische Notation ist so 80er
Omega Psi ist offline   Mit Zitat antworten
Alt 16-03-2010, 14:51   #3 (permalink)
Neuer User
 
Registriert seit: Feb 2010
Beiträge: 108
Danke, aber einen großen Unterschied zwischen deinem ersten Vorschlag und meiner Implementierung ist für mich nicht ersichtlich. Ich registriere gleich die Funktion beim EventHandler und du merkst sie dir noch vor.
Zu meinem Beispiel sei vielleicht angemerkt, spielt auch für deine zweite Variante eine Rolle, dass das ganze in einem größeren Kontext statt findet. Im Prinzip gibt es schon eine Strategy-Klasse, allerdings weiß diese nicht, um was für ein Kind (in diesem Fall eine Checkbox) es sich genau handelt. Die registerFunction() hat die Bedeutung, dass sich irgendeine Funktion (also irgend jemand) dafür interessiert, wann sich an dem Kind etwas ändert. Und je nachdem, um was für ein konkretes Kind es sich handelt, können die auslösenden Ereignisse ganz andere sein. Und über die anonyme Methode wollte ich einfach ein paar Properties usw. sparen, da die Klassen meist eh schon sehr voll sind und diese Informationen auch sonst an keiner anderen Stelle benötigt werden.

Was die ungarische Notation betrifft:
  1. Ich bin 80er Jahrgang
  2. Bei uns ist es Standard
  3. Ob ich jetzt _ schreibe oder v, was in "meiner" Welt das äquivalent dazu ist, macht keinen großen Unterschied. Außer das ich dann zusätzlich noch zwischen Parametern, statischen Attributen usw. unterscheiden kann.
  4. Zudem finde ich es schön
  5. Und früher war sowieso alles besser
Immerhin sind meine Code-Beispiele schon in englisch (im Gegensatz zu meinem eigentlichen Code)
Szdnez ist offline   Mit Zitat antworten
Alt 16-03-2010, 16:15   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Zitat:
Zitat von Szdnez Beitrag anzeigen
Danke, aber einen großen Unterschied zwischen deinem ersten Vorschlag und meiner Implementierung ist für mich nicht ersichtlich. Ich registriere gleich die Funktion beim EventHandler und du merkst sie dir noch vor.
Das ist ein großer Unterschied, da ich unabhängig vom Scope mit der Closure arbeiten kann, während deine Variante nicht funktioniert...

Zitat:
Zitat von Szdnez Beitrag anzeigen
Immerhin sind meine Code-Beispiele schon in englisch (im Gegensatz zu meinem eigentlichen Code)
You heathen!!!

Und noch eine Variante, die ich wählen würde, müsste ich mit einer Closure arbeiten:
ActionScript:
  1. package
  2. {
  3.     import flash.events.Event;
  4.  
  5.     import mx.controls.CheckBox;
  6.  
  7.     public class SuperCheckBox extends CheckBox
  8.     {
  9.  
  10.         private var _newFunction:Function;
  11.  
  12.         public function get newFunction():Function
  13.         {
  14.             return _newFunction;
  15.         }
  16.  
  17.         public function set newFunction(value:Function):void
  18.         {
  19.             _newFunction = value;
  20.         }
  21.  
  22.         public function SuperCheckBox()
  23.         {
  24.             super();
  25.  
  26.             addEventListener(Event.CHANGE, changeHandler);
  27.         }
  28.  
  29.         public function changeHandler(event:Event):void
  30.         {
  31.            if (newFunction != null)
  32.            {
  33.                newFunction(this);
  34.            }
  35.         }
  36.     }
  37. }
Omega Psi 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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wie anonymen Listener wieder entfernen? Bartolo ActionScript 3 6 18-02-2007 21:54
Eine Referenz ist ein referenz ist eine Referenz... kelor ActionScript 1 2 28-01-2005 22:10
linearTween und methoden???? dabinjo Softwarearchitektur und Entwurfsmuster 0 24-11-2004 00:51
loadVars nur mit anonymen Funktionen ? Blinker Flash MX 3 21-07-2004 14:34
xml methoden lepimax Flash mit XML und Webservices 1 29-03-2004 13:16


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele