AS3 Библиотека символьная связь - PullRequest
2 голосов
/ 15 июня 2011

У меня проблема с использованием класса, который я создал в качестве базового класса для библиотечных символов:

Я создал класс 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' так как он связан с символом библиотеки этого типа.

Есть ли способ обойти это? Я не хочу выполнить одно из следующих действий:

  1. Сделать AvSkin расширить MovieClip.
  2. Создать класс для моего библиотечного символа, который расширяет AvSkin.

См. здесь для подробного представления о том, что расширяет DisplayObject , что может помочь обосновать обоснование моего вопроса.

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Символы библиотеки имеют заданный тип, то есть MovieClip или Sprite и так далее. Если вы хотите наследовать от них, вы должны использовать это как базовый класс. Для этого нет обходного пути, это парадигма ООП для языков, которые не поддерживают множественное наследование, чем 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
}
0 голосов
/ 15 июня 2011

Как насчет использования композиции?Вы можете создать экземпляр 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());

Теперь вы можете суперклассировать его столько, сколько вам 'мне нравится.

0 голосов
/ 15 июня 2011

Как насчет расширения Sprite ? Это один из самых скромных подклассов DisplayObject, который не будет обладать большинством функций MovieClip.

...