Я думаю, что вы на правильном пути, будь то правильный один или неправильный один, всегда субъективен. Но если вы действительно хотите пойти по этому пути, я предлагаю вам прочитать эту статью Мика Уэста. Его несколько лет, но он все еще очень применим.
Я думаю, у вас действительно есть два различных интерфейса, но, вероятно, больше
public interface IMoveable {
function moveLeft(obj:DisplayObject):void;
function moveRight(obj:DisplayObject):void;
function moveUp(obj:DisplayObject):void;
function moveDown(obj:DisplayObject):void;
function Flee(obj:DisplayObject);
}
public interface IFightable {
function doDamage(withWeapon:IEquipableWeapon);
function takeDamage(fromWeapon:IEquipableWeapon);
function get isAlive():Boolean;
function checkDeath():void;
function Die():void;
function doHeal();
function get health():Number;
}
Тогда ....
public class SimpleMover implements IMoveable {
// The movement implementation
// for example:
public funciton moveLeft(obj:DisplayObject) {
obj.x = obj.x -= 10;
}
}
public class SimpleFighter implements IFightable {
// The fighting implementation
private var _health:Number = 100;
function doDamage(withWeapon:IEquipableWeapon) {
_health -= withWeapon.damage;
}
}
Затем добавьте их в свой подкласс MovieClip
для своего Hero
.
public class Hero extends MovieClip {
private var _mover:IMoveable;
private var _fighter:IFightable;
public function Hero(mover:IMoveable, fighter:IFightable) {
_mover = move;
_fighter = fighter;
}
}
Здесь вы используете класс Hero
в качестве компонента Component Manager и Render, что немного противоречит тому, о чем Уэст говорит в этой статье, но я отступаю. Но идея заключается в том, что ваш менеджер (Hero
) становится более или менее оркестратором, передавая обратные вызовы, к которым применим любой компонент; вызывая методы на _mover
и fighter
для выполнения вашей реальной работы.
Есть несколько преимуществ использования подобного подхода и некоторые недостатки. Во-первых, его сложнее настроить; это требует, чтобы вы действительно любили компоненты и то, что собирается делать каждый логический кусок кода. Но, с другой стороны, он отделяет ваши реализации друг от друга, делает его более тестируемым и многократно используемым. Вы также можете поменять компоненты в любое время (во время компиляции или во время выполнения), что обеспечивает гибкость при создании новых сущностей.
Но в любом случае, это всего лишь предположение о несколько иной парадигме, с которой вы, кажется, заигрываете. Может быть, вы получите немного от этого. Но обязательно прочитайте статью, если вы еще этого не сделали.
Также обратите внимание (например, на API) на Unity Engine, который имеет аналогичную модель агрегации и наследования, где интерфейсы являются ключом к абстракции.