Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Button = atom.Class({
Implements: [Drawable, Clickable, Draggable],
draw: function () {
// drawing
}
});
render.rotationProperty = new PropertyReference("@Spatial.rotation");public static function getPropertyString(entityName:String, propertyName:String):String
{
return "@" + entityName + "." + propertyName;
}class DisplayObject
{
function compose(c:Function):Object
{
var target:IComposer = new c;
target.host = this;
return target;
}
// Указываем для класса любое количество объектов составного функционала.
// Объект составного функционала заключает в себя все необходимые св-ва
// и методы для управления этим функционалом.
// Связь объекта составного функционала с "носителем" осуществляется через св-во "host".
// Благодаря геттеру, экономим память для объектов, не использующих составной функционал.
private var __listeners:Listeners;
public function get listeners():Listeners
{
return this.__listeners = this.__listeners || this.compose(Listeners);
}
...
private var __interaction:Interaction;
public function get interaction():Interaction
{
return this.__interaction = this.__interaction || this.compose(Interaction);
}
...
private var __drag:Drag;
public function get drag():Drag
{
return this.__drag = this.__drag || this.compose(Drag);
}
...
// И т.д.
// Пример метода для понимания обратной связи
public function applyState():void
{
if (this.__interaction && this.__interaction.highlight)
// что-то делаем
}
}
class Interaction implements IComposer
{
// Носитель может имплементить нужный интерфейс для обращения к нему напрямую.
public var host:*;
// Примеры методов (геттеры и подробности реализации опущены):
public function set focus(value:Boolean):void
{
Focus.instance.current = this.host;
this.host.applyState();
}
...
public function set highlight(value:Boolean):void
{
this.__highlight = value;
this.host.applyState();
}
// И т.д.
}
// Применение
myClip.listeners.add(DragEvent.START, ...);
myClip.interaction.active = true;
myClip.drag.start();
// И т.д
Код становится тяжело отлаживать, модифицировать и сопровождать.

Что не так с наследованием? Разработка флэш-игр с использованием фреймворка PushButton Engine