Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 动作脚本3-通过实现OOP(可能是抽象黑客)简化代码_Actionscript 3_Inheritance_Initialization_Abstract Class - Fatal编程技术网

Actionscript 3 动作脚本3-通过实现OOP(可能是抽象黑客)简化代码

Actionscript 3 动作脚本3-通过实现OOP(可能是抽象黑客)简化代码,actionscript-3,inheritance,initialization,abstract-class,Actionscript 3,Inheritance,Initialization,Abstract Class,如果我的问题不清楚,我会提前道歉,因为我不知道该怎么说 我试图通过实现各种OOP方法/概念来减少几行重复代码 问题 我有几组具有初始化过程的类。因此,我在所有这些类中实现了init()方法。从调用类(main)中,这些对象将被实例化,每个对象的init()方法将按顺序调用,并在所有对象初始化后调用其他一些进程 像这样的 public function mainClass(){ _obj1 = new Class1(); _obj1.init();

如果我的问题不清楚,我会提前道歉,因为我不知道该怎么说

我试图通过实现各种OOP方法/概念来减少几行重复代码

问题

我有几组具有初始化过程的类。因此,我在所有这些类中实现了init()方法。从调用类(main)中,这些对象将被实例化,每个对象的init()方法将按顺序调用,并在所有对象初始化后调用其他一些进程

像这样的

     public function mainClass(){

        _obj1 = new Class1();
        _obj1.init();
        _obj2 = new Class2();
        _obj2.init();
        _obj3 = new Class3();
        _obj3.init();

        doSomething();
     }
这没什么大不了的,但有些类的init()方法是异步的,我需要添加一个事件侦听器,以便在它们完成初始化时收到通知

我尝试为每个类扩展EventDispatcher,并分派事件并处理它。我甚至通过维护一个计数器实现了处理多个asynchhnous调用的逻辑

每当我需要添加一个新类时,这对我来说将是一项痛苦的工作。我想我可以解开OOP,减少和简化代码

所以我想出了一些类似的东西,这是目前不可能的(抽象类)

这是我的主要问题,正如您所知,AS3中不允许使用抽象类,“This”指的是初始值设定项类,但我猜不是它的子类。 这就是我请求您帮助(黑客)

我非常需要它,以使我的系统设计简单灵活,因为我可以扩展解决方案以允许大规模同步初始化,这将允许轻松按顺序排列所有对象,并按添加顺序逐个调用init()。

负责处理异步作业的mass初始值设定项

public class MassInitializer
{
    private var _objList:Array; //holds objects
    private var _callBacks:Array;
    private var _onComplete:Function;

    public function MassInitializer()
    {
        _objList = new Array();
    }

    public function add(obj:Initializable,callback:Function=null):void{
        _objList.push(obj);
        _callBacks.push(callback);
    }

    public function init():void{

        for (var i:int = 0;i < _objList.length;i++){
            _objList.init(this);
        }

    }
    private function onProgress(obj:Initializable):void{

        //do updates here
        for (var i:int;i<_objList.length;i++){

            var obj:Initializable = _objList[i];
            var fun:Function = _callBacks[i];
            //update progress
            if (fun){
                fun(obj);
            }

            _callBacks.splice(i,1);
            _objList.splice(i, 1);
        }

        if (_objList.length == 0){
            onComplete();
        }

    }

    private function onComplete():void{
        _onComplete(this);
    }

}

可能我正在尝试(或想要)实现一个观察者模式,但我不想通过提前说来迷惑您。哎呀,我说了?请忽略。

这不是“黑客”。这也很简单。使每个子类实现一个接口,而不是扩展一个抽象类


是AS3接口上的adobe引用。

您可以通过强制方法重写来模拟ActionScript中的抽象类:如果调用了“abstract”方法,只需抛出一个错误即可。我也喜欢实现接口,但这当然不是必须的:

public interface Initializable 
{
    function init (callback : Function = null) : void;
    function get callback () : Function;
    function set callback ( callback : Function ) : void;
}

public class AbstractInitializableImpl implements Initializable
{
    private var _callBack:Function;

    protected function init(callback:Function=null):void {
        throw new Error ("You must implement the init() method!");
    }

    protected function get callback():Function {
        return _callBack; 
    }

    protected function set callback(func:Function):void {
        _callBack = func;
    }

    protected function onComplete():void {

        if (_callBack){
            _callBack(this);
        }
    }
}

只有接口不允许您实现方法,而抽象类会…onComplete()中的“this”怎么办。我希望它是子类的实例。它是AbstractInitializableImpl还是its子类?
始终是指向对象实例的指针,因此它具有超类和子类的特性。所有方法调用总是在最专门的子类上调用,并且只有在没有可用实现的情况下才在类型层次结构中向上转发。此规则的唯一例外是从超类中对超类调用
private
方法。
public class MainClass
{
    private var _obj1:ClassA;
    private var _obj2:ClassB;
    public function MainClass()
    {
        _obj1 = new ClassA();
        _obj2 = new ClassB();
    }

    public function init():void{

        var initManager:MassInitializer = new MassInitializer();

        initManager.add(obj1);
        initManager.start();

    }
}
public interface Initializable 
{
    function init (callback : Function = null) : void;
    function get callback () : Function;
    function set callback ( callback : Function ) : void;
}

public class AbstractInitializableImpl implements Initializable
{
    private var _callBack:Function;

    protected function init(callback:Function=null):void {
        throw new Error ("You must implement the init() method!");
    }

    protected function get callback():Function {
        return _callBack; 
    }

    protected function set callback(func:Function):void {
        _callBack = func;
    }

    protected function onComplete():void {

        if (_callBack){
            _callBack(this);
        }
    }
}