Je pense que vous êtes sur une bonne voie , si son le droit un ou le mauvais on est toujours subjective. Mais si vous voulez aller sur cette route, je vous suggère de lire this article par Mick West. C'est quelques années, mais c'est toujours très applicable.
Je pense que vous avez vraiment deux interfaces distinctes, mais probablement plus
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;
}
Alors ....
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;
}
}
ensuite injecter ceux dans votre sous-classe MovieClip
pour votre 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;
}
}
Ici, vous utilisez la classe Hero
à la fois comme gestionnaire de composants et Render composant, qui va un peu contre ce Ouest parle dans l'article, mais je digresse. Mais l'idée est que votre Manager (le Hero
) devienne plus ou moins un orchestrateur, procurant des appels à travers lesquels n'importe quel composant est applicable; appeler des méthodes sur _mover
et fighter
pour faire votre travail actuel.
Il y a plusieurs avantages à utiliser une telle approche et certains inconvénients. D'abord, c'est plus complexe à mettre en place; Cela vous oblige à vraiment aimer les composants et ce que chaque bloc logique du code va faire. Mais d'un autre côté, il découpe vos implémentations les unes des autres, les rend plus testables et réutilisables. Vous pouvez également échanger des composants à tout moment (à la compilation ou à l'exécution d'ailleurs), ce qui vous donne une certaine flexibilité lors de la création de nouvelles entités.
Mais de toute façon, c'est juste une suggestion d'un paradigme légèrement différent avec lequel vous semblez flirter. Peut-être que vous aurez un peu de kilométrage. Mais donnez certainement lecture de l'article, si vous ne l'avez pas déjà fait.
Examinez également (comme vérifier l'API) pour Unity Engine qui a un modèle d'agrégation et d'héritage similaire où les interfaces sont la clé de l'abstraction.
Les interfaces dans as3 sont souvent trop compliquées. Ce n'est pas Java :) –