Я заранее прошу прощения, если мой вопрос не ясен, потому что я не знаю, как это сформулировать.
Что я пытаюсь сделать, это сократить несколько строк повторяющегося кода путем реализации различных методов / концепций ООП.
Проблема
У меня мало наборов классов, которыеимеет процесс инициализации.Итак, я реализую метод 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();
}
}
вероятно, я пытаюсь (или хочу)реализовать шаблон наблюдателя, но я не хочу вводить вас в заблуждение, говоря об этом заранее.Ой, я сказал это?пожалуйста, игнорируйте.