Статьи

Добавление множественного наследования в AS3 с чертами и Realaxy Editor

В этом посте вы узнаете о языковом расширении под названием Traits , функции новой бета-версии RASE , умной и современной IDE для Adobe Flash на базе Jetbrains MPS. Черты позволят вам использовать множественное наследование в ваших проектах, поэтому класс может эффективно расширять два других класса.

Пример проекта был создан с использованием ActionScript 3.0 с расширением языка Traits с использованием Realaxy ActionScript Editor (RASE). Если вы хотите сделать то же самое, RASE можно скачать здесь (если вы новичок в RASE, пожалуйста, следуйте руководству для начинающих здесь )

ActionScript — это современный объектно-ориентированный язык. В настоящее время фактическое определение и интерпретация ООП предполагают, что множественное наследование является порочной практикой. Таким образом, сама AS не разрешает множественное наследование, и только использование интерфейсов обеспечивает альтернативу. Это все хорошо, не нужно спорить.

Однако иногда это кажется невыносимым. Бывает, что из-за этой недостающей функции мы делаем наш код слишком сложным или даже, возможно, грязным.

Например, у нас есть класс Creature , который уже расширяет Sprite . Мы хотим научить его говорить. «Правильный ООП» навязывает нам составить композицию. Итак, нам нужно:

  1. Создайте интерфейс ISpeaker .
  2. Добавьте метод speak() в ISpeaker .
  3. Реализуйте этот интерфейс с помощью класса Speaker .
  4. Класс Creature должен быть унаследован от ISpeaker .
  5. Затем добавьте делегата в класс Creature . peak метод s будет перенаправлять вызов функции speak() делегату.
  6. Ну, это сделано.

Давайте представим, что у нас есть множественное наследование. Затем мы создаем класс Speaker , наследуя наш класс Creature от Speaker . Вот и все, ребята.

Тогда представьте, что наше Существо должно уметь многое: ходить, двигать руками и ногами, есть, улыбаться, плакать. Может быть, также летать. Вы никогда не знаете, какие требования могут стать частью спецификации. В результате мы получаем сотни и тысячи строк « правильного » ООП-кода, который настолько избыточен и многословен, что понимание его истинного предназначения будет трудным даже для его автора.

Мы, опытные Flashers, понимаем, что описанная ситуация является чисто искусственной. Кто бы создал пакет интерфейсов для каждого аспекта поведения? Даже если они будут применимы не только для Creature . Действительно, реальный код выглядел бы по-другому, не так красиво и познавательно, но ближе к реальному миру, то есть проще.

Таким образом, оказывается, что лучшие намерения дизайнеров ECMAScript (а затем и ActionScript) по созданию современного и правильного языка ООП плохо вписываются в нашу повседневную работу.

Хватит жаловаться! У нас есть инструмент, чтобы исправить это. RASE. Realaxy ActionScript Editor . Это решение Traits , расширение языка AS3.

Давайте приступим к действию.


Сначала создайте новый проект с модулем testTraits содержащим testTraits основного класса.

фигура 1

Введите детали проекта, как показано здесь, и нажмите Next:

фигура 2

Создайте новый класс с именем Creature в пакете com.example :

Рисунок 3

Этот код должен быть создан:

Рисунок 4

Импортируйте язык черт , нажав Ctrl + L (или Command + L ).

Рисунок 5

Создайте интерфейс Speak с помощью одного метода « Speak ».

Рисунок 6

В нижней части окна есть две вкладки « Интерфейс » и « Черта ».

Выберите вкладку « Черта » (окрашена в серый цвет) и щелкните пустое поле редакторов. Появится диалоговое окно, предлагающее нам создать новую черту.

Рисунок 7

После «OK» редактор по умолчанию создает реализацию по умолчанию. Обратите внимание, что теперь это trait Speak а не interface Speak :

Рисунок 8

Добавьте тело в метод « speak »: просто проследите «Привет!» на консоль.

Рисунок 9

В классе Creature добавьте интерфейс « Speak » для « Implements ».

Рисунок 10

Редактор добавил «i» справа от имени интерфейса. Это означает, что интерфейс имеет реализацию по умолчанию — у него есть черта поведения.

Рисунок 11

RASE распознает такое поведение и не выделяет никаких ошибок при добавлении методов в класс.

Это оно! Наше Creature может говорить сейчас! Добавьте вызов метода speak() в конструктор класса, чтобы доказать это.

Рисунок 12

Отредактируйте конфигурацию запуска.

Рисунок 13

Вы увидите этот диалог:

Рисунок 14

Нажмите кнопку «+», чтобы добавить новую конфигурацию, и выберите ActionScript.

Рисунок 15

Введите детали, как показано здесь:

Рисунок 16

(Таким образом, мы можем быть уверены, что увидим след.)


Запустите скомпилированный SWF. Привет! сообщение появляется в консоли.

Рисунок 17

Вот что мы получаем:

  1. Код интерфейса и реализации связаны с инструментами навигации и закладками в редакторе.
  2. Код теперь хорошо организован. У каждой реализации есть имя: имя интерфейса + « Impl ».
  3. Повышение удобства использования. В классе, который использует это поведение, мы только добавляем наш интерфейс в implemented список.
  4. Хранение яблок и апельсинов отдельно. Класс Code of Creature не «завален» чрезмерными сущностями. Мы только что приказали Существу говорить.

В результате мы имеем поведение, которое действительно похоже на множественное наследование, но опирается на «правильные и правильные» рекомендации ООП.


Давайте посмотрим, как это работает, посмотрев на код, который мы на самом деле генерируем.

Нажмите « Построить -> Создать ( устаревший ) -> Создать текст из текущей модели ». Вновь созданный код класса Creature появится в окне «Вывод».

Рисунок 18

Приведенный выше код реализует классическую композицию. Расширение языка черт скрывает избыточные объекты и организует отношения между артефактами кода. Фактически мы работаем с «чистым» ООП-кодом.

Теперь мы видим новый быстрый и простой способ научить наше Creature как делать все. Главное — это поведение: мы применяем те же основные правила к другим классам.

Давай сделаем это за 5 минут.


Добавьте несколько новых черт — по одной для каждой конечности — так же, как мы делали раньше:

Рисунок 19

Класс Creature теперь получает много новых навыков, но его код остается легко читаемым и чистым. Без расширения языка черт он был бы совершенно другим:

Рисунок 20

Пришло время, чтобы попрощаться. Я жду ваших вопросов, предложений и комментариев.

Помните, если RASE является новым для вас, пожалуйста, прочитайте « Руководство для начинающих ».