Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   сообщить Родителю об изменении Ребенка (http://www.flasher.ru/forum/showthread.php?t=145855)

drnet_ua 21.10.2010 16:18

сообщить Родителю об изменении Ребенка
 
Код AS3:

public class ParentClass 
        {
                public var Child1:ChildClass1;
                public var Child2:ChildClass1;
                public var Child3:ChildClass1;
 
        }

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

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

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

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

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

incvizitor 21.10.2010 16:40

Код AS3:

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);
                        }
                }
 
        }
 
}

Код AS3:

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

Код AS3:

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

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

dimarik 21.10.2010 23:10

А чем эвентдиспетчер не устраивает? Все равно вы именно его придумываете.


Часовой пояс GMT +4, время: 13:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.