Просмотр полной версии : сообщить Родителю об изменении Ребенка
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.
Передавать ссылку на родителя детям. Пусть вызывают методы. Желательно через интерфейс.
Хотя это не сильно правильный подход.
incvizitor, если я правильно понял код removeItem, то его до двух строк сократить не пробовали?
Можно просто родительскую функцию ребенку передать, типа callback. Изменился – вызвал.
incvizitor
21.10.2010, 17:18
public function removeItem(it:*):void {
if(_items.indexOf(it) != -1)
_items.splice(_items.indexOf(it),1);
}
Просто иногда пишу по старинке, что бы, так сказать, самые основы не забывать))
А чем эвентдиспетчер не устраивает? Все равно вы именно его придумываете.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.