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され(スキンを、、、などにすることができるようにTextFieldSimpleButtonShapeではないMovieClipため、ライブラリシンボルの基本クラスとして設定すると、このエラーがスローされることです。

5000:クラス'avian.environment.skins.AvSkin'は、そのタイプのライブラリシンボルにリンクされているため、'flash.display.MovieClip'をサブクラス化する必要があります。

これを回避する方法はありますか?次のいずれも実行したくありません。

  1. 拡張AvSkinしますMovieClip
  2. を拡張するライブラリシンボルのクラスを作成しますAvSkin

DisplayObjectを拡張するものの詳細な表現については、ここを参照してください。これは、私の質問の背後にある推論を裏付けるのに役立つ可能性があります。

4

3 に答える 3

4

ライブラリ シンボルには、指定されたタイプ、つまりMovieClip、またはSpriteなどがあります。これらから継承したい場合は、これを基本クラスとして使用する必要があります。これに対する回避策はありません。これは、AS3 がそうであるように、多重継承をサポートしない言語の OOP パラダイムです。継承ツリーの途中で何かを拡張することはできません。

あなたの仕事のために、あなたは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

コンポジションを使用するだけではどうですか?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 に答える
0

Spriteを拡張するのはどうですか?これは、ほとんどの MovieClip 機能を持たない、最も必要最低限​​の DisplayObject サブクラスの 1 つです。

于 2011-06-15T13:12:14.880 に答える