Как избежать повторного использования идентичного кода реализации с интерфейсом? - PullRequest
4 голосов
/ 15 апреля 2011

Прежде всего, я прошу прощения за "еще один вопрос интерфейса". Я подумал, что об этом, возможно, стоит спросить, поскольку это своего рода странная проблема. Проект, который я использую, использует Actionscript 3, но это скорее общий вопрос ООП.

Вот ситуация:

У меня есть класс, который уже наследуется от базового класса; это объект в видеоигре. (Допустим, это космический корабль.) В моей игре мне бы хотелось, чтобы на экране было много разных космических кораблей одновременно, поэтому я решил создать пул объектов, используя структуру связанного списка.

Логически, поскольку класс Spaceship уже наследуется от базового класса, я бы использовал интерфейс для определения методов, относящихся к связанному списку. Это, кроме того, позволило бы мне распространить эти методы на другие классы - например, класс Asteroid, или класс Bullet, или класс Particle.

Вот в чем проблема - сила интерфейса в том, что он позволяет вам переопределить реализацию для каждого класса, который вы используете, в зависимости от того, что вам нужно. Для чего-то вроде связанного списка, однако, код не будет меняться между классами. Поскольку я планирую иметь много классов, которые будут реализовывать эти методы объектного пула, я действительно хотел бы избегать повторного использования одного и того же кода реализации в каждом новом классе.

Вопрос: Есть ли способ избежать повторного использования одного и того же точного кода связанного списка для каждого класса, который я использую? Или это просто неизбежность? Кажется, что это нарушает принцип «Один раз и только один раз». Можно ли определить полную функцию внутри блока наследования, а не только его прототип?

Если это глупый вопрос, дайте мне знать. (Если я спрашиваю, так ли это, возможно, это так, но эй, не могу учиться, не будучи глупым время от времени.) Просто кажется, что должен быть более логичный способ сделать что-то подобное.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

В других языках, которые поддерживают множественное наследование, существует простой способ сделать это без необходимости иметь общего предка у ваших игровых объектов: ваши космические корабли могут наследовать от базового класса корабля, а также класса связанного элемента списка,К сожалению, AS3 не поддерживает множественное наследование, поэтому вы должны выбрать:

A.Используйте интерфейс в точности так, как вы предлагаете

или

B.Пусть все ваши базовые классы игровых объектов наследуются от общего предка, который реализует функциональность связанного списка и расширяет Sprite (или MovieClip), вместо базовых классов ваших игровых объектов, расширяющих Sprite или MovieClip напрямую.

Я бы, вероятно, пошелс последним, чтобы решить вашу точную проблему.Я, вероятно, произвел бы от Sprite или MovieClip и назвал бы вещь GamePoolObject или что-то в этом роде ...

0 голосов
/ 15 апреля 2011

Мне никогда не нравилось использовать интерфейсы.Что бы я сделал, это сделать еще один базовый классПервый класс будет базовым классом, назовем его SpaceObject.Все космические объекты имеют атрибуты массы, скорости, трения (если есть), вращения.SpaceObject также расширит UIcomponent, так как мы хотим, чтобы он в конечном итоге был добавлен в список отображения, и было бы неплохо иметь унаследованные методы для обнаружения попаданий.У этого также будут методы, которые будут обрабатывать движение и все остальное, необходимое для космических объектов.Тогда в любое время, когда я хочу создать новый космический объект, я просто расширяю класс SpaceObject.открытый класс SpaceShip расширяет SpaceObject илиОткрытый класс Commet расширяет SpaceObject.Эти классы будут наследовать атрибуты SpaceObjects и иметь свои собственные, например, какова длина хвоста или какое у него оружие.Они должны быть заключены в капсулу для обработки всего, что с ними связано

...