Проблема с дизайном классов и наследованием во Flash AS3

У меня проблемы с дизайном некоторых классов. У меня три класса. Один суперкласс и два подкласса.

Один подкласс (AnimatedCharacter) создается с помощью flash и используется для отображения объекта на экране. Другой (CharacterPhysics) я создал для расширения суперкласса.

Проблема в том, что я использую объект типа AnimatedCharacter, поэтому я не могу просто поместить его в переменную типа CharacterPhysics.

Я пробовал использовать своего рода шаблон декоратора, дав объекту типа CharacterPhysics ссылку на другой объект. Но теперь мне нужно переопределить все методы суперкласса и передать вызовы методов ссылке. Не идеальная ситуация.

Кто-нибудь знает, как решить такую ​​проблему?

альтернативный текст http://www.freeimagehosting.net/uploads/7a95f8352c.png

Имена AnimatedCharacter и AnimatedCharacterClass слишком похожи - это очень сбивает с толку.

Iain 11.11.2008 23:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 351
3

Ответы 3

Я не совсем понимаю цель этой структуры классов, которую вы описываете (названия классов меня сбивают с толку), но в целом на ум приходит несколько вещей, которые могут вам помочь:

Почти всегда лучшее решение - попытаться переосмыслить модель класса, оценив, следует ли, например, разбить обязанности классов альтернативным способом, чтобы можно было лучше использовать наследование и полиморфизм.

"The problem is that the object I use, is of the type AnimatedCharacter, so I can't just put it in a variable of type CharacterPhysics."

Если вы хотите поместить AnimatedCharacter в переменную типа CharacterPhysics, первое должно расширять второе, или у вас должен быть общий интерфейс (или суперкласс) для обоих, а затем ввести переменную как таковую. Если это невозможно, я считаю, что вам, вероятно, следует попытаться переосмыслить и реорганизовать всю структуру вашего класса, предполагая, что у вас есть веская «объектно-ориентированная» причина, по которой вы хотите сделать это в первую очередь;).

Если это невозможно, есть еще несколько приемов, которые вы можете оценить в своем контексте:

  • Использование миксины может работать как «множественное наследование для бедняков». У Дерека Вишусена есть несколько примеров того, как реализовать их в AS3 на flexonrails.net.
  • «Вид» реализации паттерна декоратора с flash.utils.Proxy. Проблема с этим подходом заключается в том, что вы откладываете много проверок ошибок от времени компиляции до времени выполнения, но хорошо то, что вам не нужно вручную писать «проксирующие» реализации всех методов «украшенного» объекта. , но вместо этого напишите только один (callProperty()).

Вы можете интерпретировать подкласс как экземпляр суперкласса, но не наоборот. Вы заявили это задом наперед?

Если да, вы можете использовать:

vas cp: CharacterPhysics;

...

var ac: AnimatedCharacter = cp As AnimatedCharacter

Мне кажется, что эти 2 интерфейса должны быть интерфейсами, которые реализует ваш основной класс.

Другие вопросы по теме