Форум 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=204193)

Akopalipsis 22.10.2013 17:03

А если кнопок будет много ( как например калькулятор ) это Вы предлагаете для каждой писать слушателя, в место наследования от класса у которого всё уже прописано? я не согласен.

udaaff 22.10.2013 17:07

Ну так вы же в итоге всё равно подписываетесь, только на другое событие.
Цитата:

А если кнопок будет много
Опять же от задачи зависит. Если надо будет, то для каждой пропишу =)

Akopalipsis 22.10.2013 17:13

udaaff Спасибо за обьяснения!
Хотя ещё можно и destroy сразу вызывать.
Код AS3:

package 
{
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        new AppConfig(this);
                }
        }
 
}

Код AS3:

package 
{
        import flash.display.DisplayObjectContainer;
 
        public class AppConfig
        {
                private var _doc:DisplayObjectContainer;
                private var _view:MainView;
 
                public function AppConfig(doc:DisplayObjectContainer)
                {
                        //сохраняем ссылку на DisplayObjectContainer
                        _doc = doc;
                        //создаём главный класс отображения
                        _view = new MainView();
                        //добавляем его в DisplayObjectContainer
                        _doc.addChild(_view);
                }
 
        }
 
}

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        public class MainView extends Sprite
        {
                private var _button:Button;
                private const DESTROY:uint = 0xA7A7A7;
 
                public function MainView()
                {
                        _button = new Button();
                        _button.addEventListener(MouseEvent.MOUSE_DOWN, button_mouseDownHandler);
                        _button.id = DESTROY;
                        _button.x = _button.y = 100;
                        this.addChild(_button);
                }
 
                private function button_mouseDownHandler(event:MouseEvent):void
                {
                        if (event.target.id == DESTROY) this.destroy();
                }
                private function destroy():void
                {
                        super.removeChildren();
                }
 
        }
 
}

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Button extends Sprite
        {
                private var _id:uint;
 
                public function Button()
                {
                        super();
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(event:Event=null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        super.graphics.beginFill(0x000000);
                        super.graphics.drawRect(0, 0, 70, 45);
                        super.graphics.endFill();
                }
 
                public function get id():uint
                {
                        return _id;
                }
 
                public function set id(value:uint):void
                {
                        _id = value;
                }
 
        }
 
}


Fogflasher 22.10.2013 17:50

Wolsh, ясно, значит обращение вверх по иерархии вообще ересь, и нужно менять архитектуру.

Akopalipsis, о как интересно, благодарю за пример. Чуть позже попробую протестировать, но уже при беглом осмотре имеется пара вопросов.
Но пока только хотел спросить, а что это за подход такой с MainView, почему вы его в диалоге с udaff использовали как отдельный термин?
Это часть какого-то Паттерна? Может у вас тут вообще MVC реализовано.

Babylon 22.10.2013 18:02

Обращение вверх по иерархии не ересь. Допустим если у вас одинаковое содержимое в разных контейнерах. Я для этих целей использую сами знаете что.

Akopalipsis 22.10.2013 18:10

Цитата:

Это часть какого-то Паттерна?
Проще всего представить это как диафильм. Есть класс, который отвечает только за
отображение, он создаёт и обрабатывает только визуальные обьекты.
Когда мне в первые показали такой вариант, то я его боялся и не использовал очень долго.
Но сейчас я не даже представить не могу, что буду использовать другую реализацию.
Цитата:

Я для этих целей использую сами знаете что.
Сигналы?)

Wolsh 22.10.2013 19:01

Цитата:

if (event.target.id == DESTROY) this.destroy();
Не надо target. id это свойство Button. Вы же подписывались на событие от _button, а это .currentTarget
Мало того, если _button член класса, как в данном коде, id вообще не нужен.
Код AS3:

if (event.currentTarget == _button) this.destroy();

И не заводите привычку подписывать кнопки на даун. Только клик. Юзер должен иметь возможность передумать.

Akopalipsis 22.10.2013 19:05

Вот я и говорю, что destroy можно сделать слушателем.

Babylon 22.10.2013 20:20

У меня есть dict[node.@id]=class

Fogflasher 23.10.2013 00:19

Akopalipsis, разбираю ваш пример, идея прикольная, но и вопросов много )


1.
Код AS3:

private function init(e:Event = null):void

Зачем здесь прописывать дефолтный null, это чем то лучше, чем оставить просто e:Event?
А разве по умолчанию оно и не будет равно null? Или тут есть какой-то ньюанс...


2.
Код AS3:

new AppConfig(this);

Как доступно для нуба озвучить смысл сего оператора?
Я понимаю его так: Создать экземпляр класса AppConfig и передать ему экземпляр класса Main.
Правильно ли это? И кстати, это пример Композиции? Видимо это пример "Недокомпозиции", так сказать...
Ведь мы этот оператор не присваиваем никакой переменной, то есть экземпляр завис в воздухе.


3.
Код AS3:

_doc.addChild(_view);

Правильно ли я понимаю, что по сути мы сейчас добавили экземпляр класса MainView в экземпляр класса Main?
И именно для этого писали new AppConfig(this); то есть передача через конструктор обязательна. И по другому нельзя.


4.
Код AS3:

private var _button:Button;

Сначала я было подумал, что мы будем юзать некий системный класс Button, потому что это слово подсвечивается.
Однако потом увидел, что ваш четвертый класс имеет такое же имя... Это смущает.
То есть, выходит, создав свой класс Button мы как бы оттенили системный класс с таким же именем.
Этакий классовый оверрайд?


5.
Код AS3:

_button.id = DESTROY;

А вот этот .id - это что за свойство, оно же не было ранее объявлено нигде.
Или это какой-то трюк, типа, мы можем налету присобачить к экземпляру любые свойства?


6.
Код AS3:

this.destroy();

Хм, как-то цельное понимание не складывается. То есть мы сделали следующее:
Применили к текущему экземпляру класса MainView метод destroy, который обратился к экземпляру класса выше
(то есть super. это ссылка на Main, ведь так?), и удалил всех его детей. Выходит, это всё равносильно записи: this.super.removeChildren();


7.
Код AS3:

public function Button() 
                {
                        super();                                                                       
 
                        //...
 
                }

Не понимаю, что здесь делает super(); Он вызывает конструктор системного класса Sprite, но... что это дает?
Это равносильно записи new Sprite(); так чтоли? Но даже если так, то экземпляр завис в воздухе, и мы его потеряли.
Тогда "... зачем ей все шелка?" (с)


8. Функции get и set, в связке со свойством _id, они несут какую-то функциональность в данном примере?
Похоже что нет... Видимо добавлены для "цельности концепций", поправьте, если это не так.


9. Вы проверяли этот проект на работоспособность? А то при запуске я получаю одну ошибку:
Цитата:

1061: Call to a possibly undefined method removeChildren through
a reference with static type flash.display:Sprite. super.removeChildren();


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

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