Actionscript 3 动作脚本3-通过实现OOP(可能是抽象黑客)简化代码
如果我的问题不清楚,我会提前道歉,因为我不知道该怎么说 我试图通过实现各种OOP方法/概念来减少几行重复代码 问题 我有几组具有初始化过程的类。因此,我在所有这些类中实现了init()方法。从调用类(main)中,这些对象将被实例化,每个对象的init()方法将按顺序调用,并在所有对象初始化后调用其他一些进程 像这样的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();
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);
}
}
}