Как избежать повторного использования идентичного кода реализации с помощью интерфейса?

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

Здесь ситуация:

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

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

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

Вопрос: Есть ли способ избежать повторного использования одного и того же кода связанного списка для каждого класса, который я использую? Или это просто неизбежность? Похоже, это нарушает принцип "один раз и один раз". Можно ли определить полную функцию внутри блока наследования вместо своего прототипа?

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

Ответ 1

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

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

или

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

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

Ответ 2

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