PDA

Просмотр полной версии : сообщить Родителю об изменении Ребенка


drnet_ua
21.10.2010, 16:18
public class ParentClass
{
public var Child1:ChildClass1;
public var Child2:ChildClass1;
public var Child3:ChildClass1;

}

доступ к методам детей публичный, но для экономии, часть свойств детей дублируется в предке в виде геттеров-сеттеров

все дети взаимосвязанны, т.е. изменение одного должно приводить к изменениям всех остальных(этим должен заниматся предок)

как узнать что в ребенке что-то изменилось и запустить цепочку обновлений всех остальных?

кроме Event-ов есть варианты?

классы - чистая математика, нагружать их наследованием от ивентДиспатчера как-то не хочется :(

incvizitor
21.10.2010, 16:40
package vaukalak.managers
{
/**
* ...
* @author vaukalak
*/
public class SynchronizationGroup
{

private var _items:Vector.<SynchronizationItem> = Vector.<SynchronizationItem>([]);

public function SynchronizationGroup() {

}

public function addItem(it:*, scale:Number = 1, off:Number = 0):SynchronizationItem {
var item:SynchronizationItem = new SynchronizationItem(it, scale, off);

_items.push(item);

return item;
}

public function removeItem(it:*):void {
var shifht:Boolean = false;
var i:uint = 0;
while (!shifht && (i < _items.length)) {
if (_items[i].object == it) {
shifht = true;
_items[i] = null;
}
i++;
}
if (shifht) {

for (i = i; i < _items.length; i++)
_items[i - 1] = _items[i];

_items.length--;

}
}

public function clear():void {
_items = Vector.<SynchronizationItem>([]);
}

public function updateItems(prop:String, val:Number):void {
for (var i:uint = 0; i < _items.length; i++) {
_items[i].setValue(prop, val);
}
}

}

}



package vaukalak.managers
{
/**
* ...
* @author vaukalak
*/
public class SynchronizationItem
{

internal var object:*;

private var _propertyOffsets:Object={};

public var scale:Number;
public var offset:Number;

public function SynchronizationItem(obj:*, sc:Number=1, off:Number=0) {
object = obj;
scale = sc;
offset = off;
}

internal function setValue(prop:String, val:Number):void {
object[prop] = (val + offset + (_propertyOffsets[prop] ? _propertyOffsets[prop] : 0)) * scale;
}

public function setPropertyOffset(prop:String, val:Number):void {
_propertyOffsets[prop] = val;
}

}

}


Еще не дописал правда, но работает :)
Создаёте группу в неё пихаете все объекты что нужно. Можно указать scale и offset для каждого итема, а также для нейкого определённого его свойства. Что бы изменить свойства всех объектов, вызывайте метод updateItems класса SynchronizationGroup.

etc
21.10.2010, 16:47
Передавать ссылку на родителя детям. Пусть вызывают методы. Желательно через интерфейс.
Хотя это не сильно правильный подход.

incvizitor, если я правильно понял код removeItem, то его до двух строк сократить не пробовали?

alatar
21.10.2010, 17:17
Можно просто родительскую функцию ребенку передать, типа callback. Изменился – вызвал.

incvizitor
21.10.2010, 17:18
public function removeItem(it:*):void {
if(_items.indexOf(it) != -1)
_items.splice(_items.indexOf(it),1);
}


Просто иногда пишу по старинке, что бы, так сказать, самые основы не забывать))

dimarik
21.10.2010, 23:10
А чем эвентдиспетчер не устраивает? Все равно вы именно его придумываете.