2

我在使用我创建的类作为库符号的基类时遇到问题:

我创建了一个类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(以便我可以使皮肤 a TextFieldSimpleButtonShape等)而不是MovieClip,所以如果我将其设置为库符号的基类,它会引发此错误:

5000:类“avian.environment.skins.AvSkin”必须是“flash.display.MovieClip”的子类,因为它链接到该类型的库符号。

有没有解决的办法?我不想做以下任何一个:

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

有关扩展 DisplayObject 的详细说明,请参见此处,这可能有助于支持我的问题背后的推理。

4

3 回答 3

4

库符号具有给定的类型,即MovieCliporSprite等​​等。如果你想继承这些,你必须使用它作为基类。没有解决方法,它是不支持多重继承的语言的 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
}
于 2011-06-15T13:11:24.243 回答
0

扩展Sprite怎么样?这是最简单的 DisplayObject 子类之一,它不具备大部分 MovieClip 功能。

于 2011-06-15T13:12:14.880 回答
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());

现在,您可以根据需要对它进行超类化。

于 2011-06-15T16:49:33.190 回答