Mixins - хорошая идея, но ее поддержка в AS3, ну, в общем, имитируется.
Вариант 2 будет работать, но раскрытие экземпляра DamageManager нарушает инкапсуляцию. Вы можете решить эту проблему, добавив метод Hit в ваш интерфейс IHitable. Этот метод будет вызываться вашей игрой, когда что-то попадает в этот объект. Реализация этого метода зависит от объекта. Вы можете реализовать его по-разному для каждого объекта (вариант 1), но вы также можете создать общий класс DamageManager и использовать его для расчета ущерба.
class DamageManager {
public function calculateDamage(...){
// implement your damage logic...
}
}
interface IHitable {
function hit(by:GameObject);
}
А для примера в CombatPlayer
class CombatPlayer implements IHitable
{
private var _damage:DamageManager;
public function CombatPlayer(){
_damage = new DamageManager();
}
public function hit(by:GameObject):void {
_damage.calculateDamage(...);
}
}
Я оставил реализацию DamageManager открытой, так как я не знаю, как реализованы ваши объекты, и как вы хотите рассчитать ущерб.
Я думаю, что в идеале DamageManager не должен напрямую изменять ваш объект. Вы можете передать объект Stat (который содержит информацию о здоровье и щите объекта) вместе с другим объектом, описывающим свойства "нападающего", и DamageManager вернет другой объект Stat, который можно использовать для обновления статистики "нападающего".
Надеюсь, что это имеет смысл!