AS3库符号链接

时间:2011-06-15 12:53:41

标签: 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 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(这样我可以让皮肤成为TextFieldSimpleButtonShape等,而不是MovieClip ,如果我将其设置为库符号的基类,则会抛出此错误:

  

5000:上课   'avian.environment.skins.AvSkin'必须   子类'flash.display.MovieClip'   因为它链接到库符号   那种类型。

有解决方法吗?我想要执行以下任一操作:

  1. AvSkin延长MovieClip
  2. 为我的库符号创建一个扩展AvSkin
  3. 的类

    请参阅here for a detailed representation of what extends DisplayObject,这可能有助于支持我的问题背后的推理。

3 个答案:

答案 0 :(得分:4)

图书馆符号具有给定类型,即MovieClipSprite,依此类推。如果要继承这些,则必须将其用作基类。对此没有解决方法,它是不支持多重继承的语言的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());

现在你可以根据自己的喜好对它进行超类。