Flash AS3库符号链接
使用我创建的类作为库符号的基类时出现问题: 我已经创建了一个类Flash AS3库符号链接,flash,actionscript-3,symbols,linkage,Flash,Actionscript 3,Symbols,Linkage,使用我创建的类作为库符号的基类时出现问题: 我已经创建了一个类AvSkin,它将作为AvChild实例的显示。看起来是这样的: package avian.environment.skins { import flash.display.DisplayObject; /** * @author Marty Wallace * @version 1.0.0 */ public class AvSkin extends DisplayObjec
AvSkin
,它将作为AvChild
实例的显示。看起来是这样的:
package avian.environment.skins
{
import flash.display.DisplayObject;
/**
* @author Marty Wallace
* @version 1.0.0
*/
public class AvSkin extends DisplayObject
{
/**
* Getters
*/
public function get top():Number{ return y - height/2; }
public function get left():Number{ return x - width/2; }
public function get bottom():Number{ return y + height/2; }
public function get right():Number{ return x + width/2; }
}
}
var skin:AvSkin = new AvSkin(new MyMovieClip());
显然没有做很多,但关键是我可以在以后添加(即render()
方法)
问题是,因为这扩展了DisplayObject
(这样我就可以使皮肤成为TextField
,SimpleButton
,Shape
,等等)而不是MovieClip
,如果我将其设置为库符号的基类,它会抛出此错误:
5000:班级
“avian.environment.skins.AvSkin”必须
子类“flash.display.MovieClip”
因为它链接到库符号
那种类型的
有办法解决这个问题吗?我不想执行以下任一操作:
AvSkin
extendMovieClip
AvSkin
的“我的库”符号创建一个类请参阅,这可能有助于支持我问题背后的推理。库符号具有给定的类型,即
MovieClip
或Sprite
等等。如果您想从这些继承,就必须将其用作基类。这方面没有解决办法,它是一个面向对象的范例,适用于不支持多重继承的语言,AS3就是这样。不能在继承树的中间扩展某些东西。< /P>
对于您的任务,您可以有一个界面
。但是您必须在所有派生类中实现这个接口。但是实现逻辑可以在静态类中外包,以确保可维护性
interface IAvSkin
{
function get top():Number;
function get left():Number;
function get bottom():Number;
function get right():Number;
}
public class AvSkin
{
public static function getTop(obj:DisplayObject):Number
{
return obj.y - obj.height/2;
}
// and so on
}
public class AvSkinMovieClip extends MovieClip implements IAvSkin
{
public function get top():Number{ return AvSkin.getTop(this); }
// and so on
}
public class AvSkinMovieClip extends Sprite implements IAvSkin
{
public function get top():Number{ return AvSkin.getTop(this); }
// and so on
}
扩展Sprite怎么样?这是最简单的DisplayObject子类之一,它不会有大多数MovieClip功能。只使用composition如何? 您可以实例化AvSkin并发送要扩展到其中的类:
package avian.environment.skins
{
import flash.display.DisplayObject;
/**
* @author Marty Wallace
* @version 1.0.0
*/
public class AvSkin extends DisplayObject
{
protected var _component:DisplayObject;
public function AvSkin(component:DisplayObject) {
addChild(_component = component);
}
/**
* Getters
*/
public function get top():Number{ return y - height/2; }
public function get left():Number{ return x - width/2; }
public function get bottom():Number{ return y + height/2; }
public function get right():Number{ return x + width/2; }
}
}
然后像这样使用它:
package avian.environment.skins
{
import flash.display.DisplayObject;
/**
* @author Marty Wallace
* @version 1.0.0
*/
public class AvSkin extends DisplayObject
{
/**
* Getters
*/
public function get top():Number{ return y - height/2; }
public function get left():Number{ return x - width/2; }
public function get bottom():Number{ return y + height/2; }
public function get right():Number{ return x + width/2; }
}
}
var skin:AvSkin = new AvSkin(new MyMovieClip());
现在,您可以根据自己的喜好对其进行超类化。Hmm是否可以不扩展MovieClip,而是扩展所有常见的DisplayObject子类?喜欢某种多重继承?我可以创建多种类型的皮肤,比如Avmovieclipsking、AvBitmapsking等,但是我无法扩展一个普通的皮肤类,因此必须在每个皮肤类中重复上述逻辑。实际上,有一种方法可以解决这个问题。如果您在每个派生类中使用“include”关键字,并将其指向一个常见的ActionScript文件(基本上是类的一部分,而不是整个声明),您可以将代码集中在一个位置,以便在所有类型中轻松添加更新和附加功能。这是一个好主意,但对我来说似乎是草率的,草率的,是的,但这是一个特殊的情况,它可以是有益的。这取决于更新或修改代码的频率。我有过这方面的经验,而且在第一次启动时调试确实很糟糕,但一旦一切都稳定下来,它就非常棒了。有趣的方法。但是不喜欢静态名称空间。您还可以有一个非静态助手
new AvHelper(this.getTop())
但是为该任务创建对象需要不必要的内存和执行时间。您还必须在实现IAvSkin的每个类中重新定义getter/其他方法,这不太吸引人。这个答案现在看起来很好;不过,我有一个问题:在接口中定义getter是否比在实现它的每个类中重新创建方法更有利(而不是可读性)?如果要实现接口,请确定这些getter存在于对象上。您可以在代码中使用类型IAvSkin
而不是DisplayObject、Sprite或MovieClip。您可以将对象强制转换为IAvSkin
,如果此强制转换成功,您就知道存在getter实现。如果皮肤是位图、形状或视频,该怎么办?真的!我不确定你是否需要这些:(啊,对不起。我添加了一个链接,指向可以是AvSkin(DisplayObject下的所有内容)的类型。首先应该添加说明。看起来你是在进行打字,这不需要在类本身中进行太多工作。这也不能解决我的问题,即链接库符号以使用AvSkin作为基类。感谢你尝试。是的,你将无法直接链接到该类。如果你e使用flashide将项目拖到舞台上这不会有什么帮助,但是如果您是从代码中实例化的,那么将其包装为参数并没有多大区别。