Необходимо «расширить» различные классы в ActionScript для одного класса.

У меня есть класс, который должен использовать графические методы класса Sprite, поэтому я расширил указанный класс с помощью Sprite. Однако у меня есть собственный пользовательский класс, из которого ТАКЖЕ необходимо расширить первый класс, чтобы использовать свойства и методы, написанные внутри.

Конечно, я мог бы расширить свой собственный класс с помощью Sprite, и первый класс смог бы использовать оба, но мой собственный класс не имеет ничего общего со Sprite и не должен его расширять.

Как мне использовать свойства и методы моего пользовательского суперкласса И использовать графические свойства класса Sprite в одном подклассе?


Мой простой пример:

Мой пользовательский класс называется MovingObject.as и содержит две переменные и несколько методов, которые должны быть унаследованы подклассом. Целью MovingObject является хранение информации, касающейся скорости и ускорения их дочерних классов.

Дочерний класс «RaceCar» рисуется с использованием графических методов, заданных расширением Sprite, но мне нужно расширить MovingObject, чтобы позволить RaceCar наследовать скорость и ускорение.

Я застрял на том, как дать RaceCar возможности расширения из Sprite и моего класса MovingObject.


person benabbottnz    schedule 01.11.2012    source источник


Ответы (2)


Если ваш первый класс необходимо добавить в список отображения, он почти наверняка должен расширять Sprite. То, как вы сделаете функциональность своего второго пользовательского класса доступной для него, вероятно, будет зависеть от того, что это за функциональность (если бы вы могли дать краткое описание, это значительно облегчило бы ответ на вопрос).

Однако, помимо расширения (которое вы исключили), я могу придумать два других метода:

  1. Дайте вашему первому классу экземпляр вашего пользовательского класса, чтобы действовать либо через установщик, либо путем создания экземпляра пользовательского класса непосредственно в вашем первом классе. Это известно как композиция.
  2. Сделайте методы своего пользовательского класса статическими, чтобы их можно было вызывать из первого класса без его создания. Этот метод обычно используется для классов служебных типов.

Обновление:

Я думаю, что в этом случае вы можете излишне усложнять ситуацию, если только вы не предполагаете иметь подклассы MovingObject, которые визуально не представлены на экране (что мне кажется маловероятным). Если нет, то вполне допустимо, что MovingObject расширяет Sprite, фактически дополняя его движущейся функциональностью, и это формирует базовый класс для вашего RaceCar (и любых других движущихся, видимых объектов).

person net.uk.sweet    schedule 02.11.2012
comment
Спасибо за обновление, оно дает понятный аргумент в пользу того, почему расширение MovingObject с помощью Sprite должно быть правильным. - person benabbottnz; 03.11.2012

Множественное наследование не существует в AS3, но есть один достойный шаблон для решения этой проблемы:

  • У вас есть классы Base и Extension, где Extension должен расширять как Base, так и Sprite.
  • Сделайте Base интерфейсом, и ваш текущий класс Base станет реализацией этого интерфейса по умолчанию, скажем, BaseImpl.
  • Сделать Extension расширить Sprite и реализовать Base.
  • Реализация Base будет выполняться путем агрегирования экземпляра BaseImpl, что означает, что все методы Base будут делегированы изолированному экземпляру BaseImpl.

Пример:

interface Base {
    function hello():String;
}

class BaseImpl implements Base {
    public function hello():String {
        return "Hello";
    }
}

class Extension extends Sprite implements Base {

    private var base:BaseImpl = new BaseImpl();

    public function hello():String {
        return base.hello();
    }
}

Таким образом, Extension делегирует все функции Base содержащемуся в нем экземпляру BaseImpl.

Кстати, в самом Flash API есть пример именно такого шаблона: EventDispatcher — это реализация по умолчанию IEventDispatcher, так что другие классы могут расширять класс, отличный от EventDispatcher, и по-прежнему реализовывать IEventDispatcher посредством агрегации.

Удачи!

person Torious    schedule 02.11.2012
comment
Это очень помогает, так как я не знал об использовании интерфейсов. Однако мне нужно наследовать свойства вместе с методами, но из того, что я читал до сих пор, в интерфейсе есть только методы. Спасибо, что познакомили меня с этим. - person benabbottnz; 03.11.2012