来自子类的AS3 getter setter

时间:2011-04-25 08:39:00

标签: flash actionscript-3

我知道这已经被覆盖了很多,但我似乎无法让它发挥作用。

如何从主类听到变量更改的子类?

package  {

    import flash.events.*

    public class DataBase extends MovieClip  {

        private var _OPPONENTTYPE:int = 0;

            public function DataBase() {
               OPPONENTTYPE(1);
            }
        public function get OPPONENTTYPE():int {
            return _OPPONENTTYPE;
        }
        public function set OPPONENTTYPE(num:int) {
            _OPPONENTTYPE = num;
            dispatchEvent(new Event(DataBase._OPPONENTTYPE));
        }

这是我到目前为止对子类的看法,但我似乎无法弄清楚如何从Main()中听取这个变量,或者即使我正确地调度事件。

2 个答案:

答案 0 :(得分:2)

假设Main有一个对Database类的引用,你可以这样做:

首先,在Database中声明一个公共const来保存事件的名称。这比在事件代码中使用字符串更好,因为它允许编辑器进行错误检查和自动完成。

public static const DATABASE_CHANGE:String = "onDatabaseChange";

现在修改你的setter以使用这个const:

public function set OPPONENTTYPE(num:int) {
    _OPPONENTTYPE = num;
    dispatchEvent(new Event(DataBase.DATABASE_CHANGE));
}

在Main中你需要监听事件(假设你已经实例化并引用了数据库):

databaseRef.addEventListener(Database.DATABASE_CHANGE,dbChangeHandler);

最后,在处理程序中,通过查看事件对象的目标(将是您的数据库类)或使用您在设置侦听器时使用的引用来检查OPPONENTTYPE的新值:

private function dbChangeHandler(evt:Event):void
{
    //both lines output the same
    trace(evt.target.OPPONENTTYPE);
    trace(databaseRef.OPPONENTTYPE);
}

答案 1 :(得分:1)

执行此操作的一种好方法是为变量创建自定义事件类型

package  {  
    import flash.events.Event;
        public class VariableEvent extends Event{
            public var variableName:object;
            public var oldValue:object;
            public var newValue:object;
            static public var VALUE_CHANGE:String = "VALUE_CHANGE";

            public function VariableEvent(variableName:String, oldValue:object, newValue:object, bubbles:Boolean = false, cancelable:Boolean = false){
            super(VALUE_CHANGE, bubbles,cancelable);

            this.variableName = variableName;
            this.oldValue = oldValue;
            this.newValue = newValue;
        }
    }

} 

在MAIN类中添加事件处理程序/侦听器,其中包含对象的引用 mydispatcher

mydispatcher.addEventListener(VariableEvent.VALUE_CHANGE, variableChangedListener); 

和MAIN类中的Handler函数将是

private function variableChangedListener(event:VariableEvent):void
    {
        Alert.show(event.variableName +"Changed From "+event.oldValue+" To "+event.newValue);
    }

Dispatch Event就像mydispatcher

的变量值变化一样
dispatchEvent(new VariableEvent("variableName",<old Value>, <changed/new Value>));

希望有所帮助