сценарий действия 3 - упрощение кода путем реализации ООП (возможно, абстрактного взлома) - PullRequest
1 голос
/ 22 февраля 2012

Я заранее прошу прощения, если мой вопрос не ясен, потому что я не знаю, как это сформулировать.

Что я пытаюсь сделать, это сократить несколько строк повторяющегося кода путем реализации различных методов / концепций ООП.

Проблема

У меня мало наборов классов, которыеимеет процесс инициализации.Итак, я реализую метод init () во всех этих классах.Из вызывающего класса (main) эти объекты будут созданы, и метод init () каждого объекта вызывается в порядке и вызывает какой-то другой процесс после того, как все они инициализированы.

Что-то вроде этого

     public function mainClass(){

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

        doSomething();
     }

Ну, это не имеет большого значения, но некоторые из методов init () классов являются асинхронными, и мне нужно добавить прослушиватель событий, чтобы получать уведомления, когда они закончили инициализацию.

Я попробовал это, расширив EventDispatcher для каждого из этих классов и отправив событие и обработав его.Я даже реализовал логику для обработки нескольких асинхронных вызовов с помощью счетчика.

Это будет болезненной работой для меня всякий раз, когда мне нужно будет добавить новый класс.Я думал, что смогу уменьшить размер ООП, уменьшить и упростить код.

Поэтому я придумал что-то подобное, что в настоящее время невозможно (абстрактный класс).

abstract class Initializable
{
    private var _callBack:Function;

    //implement initializaton process in this method
    function init(callback:Function=null):void;

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

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

    protected function onComplete():void{

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


}

Это основная проблема для меня, так как вы знаете, что абстрактный класс недопустим в AS3, и "this" относится к классу Initializer, но не к его подклассу., Это то, о чем я прошу вашей помощи (для взлома)

Мне очень нужно сделать мою систему простой и гибкой, потому что я могу расширить решение доразрешить массовую синхронную инициализацию, которая позволит легко ставить в очередь все объекты в порядке и вызывать init () один за другим в порядке их добавления.

массовый инициализатор, который заботится ообработка асинхронного задания

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);
    }

}

основной (менеджер / вызывающий) класс (ClassA, ClassB являются подклассами класса Initialzable)

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();

    }
}

вероятно, я пытаюсь (или хочу)реализовать шаблон наблюдателя, но я не хочу вводить вас в заблуждение, говоря об этом заранее.Ой, я сказал это?пожалуйста, игнорируйте.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Вы можете эмулировать абстрактные классы в ActionScript, применяя переопределения методов: просто выдавайте ошибку, если вызывается «абстрактный» метод.Мне также нравится реализовывать интерфейс, но это, конечно, не обязательно:

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);
        }
    }
}
0 голосов
/ 22 февраля 2012

Это не «взлом». Это тоже очень просто. Заставьте каждый подкласс реализовать интерфейс вместо расширения абстрактного класса.

Здесь - ссылка Adobe на интерфейсах AS3.

...