我使用我创建的类作为库符号的基类时出现问题:
我创建了一个类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; }
}
}
显然没有做太多,但关键是我可以稍后添加(即render()
方法)。
问题是,因为这扩展了DisplayObject
(这样我可以让皮肤成为TextField
,SimpleButton
,Shape
等,而不是MovieClip
,如果我将其设置为库符号的基类,则会抛出此错误:
5000:上课 'avian.environment.skins.AvSkin'必须 子类'flash.display.MovieClip' 因为它链接到库符号 那种类型。
有解决方法吗?我不想要执行以下任一操作:
AvSkin
延长MovieClip
。AvSkin
。请参阅here for a detailed representation of what extends DisplayObject,这可能有助于支持我的问题背后的推理。
答案 0 :(得分:4)
图书馆符号具有给定类型,即MovieClip
或Sprite
,依此类推。如果要继承这些,则必须将其用作基类。对此没有解决方法,它是不支持多重继承的语言的OOP范例,AS3就是这样。你不能在继承树的中间扩展一些东西。
对于您的任务,您可以拥有Interface
。但是您必须在所有派生类中实现此接口。但是实现逻辑可以在静态类中提供,以确保可维护性。
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
}
答案 1 :(得分:0)
如何扩展精灵?这是最简单的DisplayObject子类之一,它不具备大多数MovieClip功能。
答案 2 :(得分:0)
如何使用合成? 您可以实例化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; }
}
}
并像这样使用它:
var skin:AvSkin = new AvSkin(new MyMovieClip());
现在你可以根据自己的喜好对它进行超类。