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

anmelegov 11.03.2012 23:18

полиморфизм?
 
вот допустим у меня есть кастомные кнопки на панельке, каждая из которых должна запускать разную функцию. Можно ли как-то сделать оверрайд метода в потомке класса Кнопка не создавая для каждой кнопки отдельный класс?
что-то типа такого
Код AS1/AS2:

button = new Button;
button.action = customFunction() { do somthing }

Добавлено через 29 минут
всё нашёл в книжке... надо использовать prototype .... тема закрыта

КорДум 11.03.2012 23:58

Публичная переменная click:Function?
Код AS3:

button.click = myFoo();
 
private function myFoo():void {
...
}

И эту функция вызывается по клику, прописанному в хендлере внутри самой кнопки?

Silicium 12.03.2012 00:07

Цитата:

каждая из которых должна запускать разную функцию
а обработка событий вообще на что?

AlexFrost 12.03.2012 19:21

тут вообще-то AS3, а не AS2.

если AS3(FD),то
Код AS3:

button.addEventListener(MouseEvent.CLICK, doSmth);
private function doSmth(e:MouseEvent):void
{
//ололол
}


КорДум 12.03.2012 19:21

А где Вы AS2 увидели?

AlexFrost 12.03.2012 19:25

я просто начал изучение AS сразу с AS3 и сразу в FD...
и не знаю таких конструкций:
Код AS3:

button.click=

плюс у ТС код помечен как AS1/AS2.
Это и подтолкнуло на мысль что речь идёт об AS2..

КорДум 12.03.2012 19:31

Цитата:

Публичная переменная click:Function?
Я написал, что есть click. Коллбэк это, если грубо говорить.

Котяра 12.03.2012 20:04

Код AS3:

button.click = myFoo();

надо
Код AS3:

button.click = myFoo;


КорДум 12.03.2012 20:18

Ой, да. Ссылка же.

anmelegov 12.03.2012 20:40

создавать слушатель событий для каждой кнопки это по индийски, у меня 1 слушатель висит на стейдже, он смотрит во что я кликаю и делает нужные действия... для кнопок отдельный класс в котором просто есть пустой метод action() который я инициализирую кастомной функцией уже в другом классе

gloomyBrain 12.03.2012 21:50

Цитата:

создавать слушатель событий для каждой кнопки это по индийски
Ну да, switch-case на 128 кнопок куда круче

anmelegov 12.03.2012 22:21

Цитата:

Сообщение от gloomyBrain (Сообщение 1068593)
Ну да, switch-case на 128 кнопок куда круче

вы говорите чушь...
Код AS1/AS2:

public function mouseDownHandler(e:MouseEvent):void {
        if (e.target is Button) { (e.target as Button).action() }; // run button custom method
}


gloomyBrain 12.03.2012 23:29

Ну чушь так чушь. Спорить не хочется.
Могу сказать, что события - куда более гибкий способ. А уж тем более prototype - это вообще жесть из AS2.

anmelegov 12.03.2012 23:31

я не использую prototype

HardCoder 13.03.2012 00:13

Цитата:

Сообщение от gloomyBrain (Сообщение 1068593)
Ну да, switch-case на 128 кнопок куда круче

Цитата:

Сообщение от gloomyBrain (Сообщение 1068620)
Ну чушь так чушь. Спорить не хочется.
Могу сказать, что события - куда более гибкий способ. А уж тем более prototype - это вообще жесть из AS2.

gloomyBrain, а какие есть альтернативы? Просто, я всегда использовал конструкцию, похожую на то что предложил anmelegov. Решать каким-то другим способом не приходилось.
Действительно, что делать если 128 обьектов не только кнопки, а разные? При нажатии на любой выполняется разная задача. Вешать 128 слушателей? Так действительно делают?

Bgg 13.03.2012 00:22

Цитата:

Сообщение от HardCoder (Сообщение 1068632)
При нажатии на любой выполняется разная задача. Вешать 128 слушателей?

Точно так же вы будете пропихивать 128 коллбеков в свои разные кнопки.

anmelegov 13.03.2012 00:25

не знаю как работают слушатели событий на низком уровне, но подозреваю что это не одно и то же =)

Добавлено через 4 минуты
да и вообще если у меня 1 слушатель, я могу его в любой момент удалить, а потом при необходимости включить снова, в вашем подходе мне бы пришлось проходить двумерные массивы и выключать каждый по отдельности либо накрывать всё спрайтом, чтобы он перекрывал все интерфейсный элементы, а костыли я не люблю

Добавлено через 5 минут
то как реализовано у меня больше похоже на полиморфизм

Добавлено через 8 минут
я только что ради интереса открыл книжку мука и в ней написано что вы не правы на странице 564

Добавлено через 10 минут
со страницы 574 читайте подробнее

Bgg 13.03.2012 00:36

Цитата:

Сообщение от anmelegov (Сообщение 1068635)
Добавлено через 8 минут
я только что ради интереса открыл книжку мука и в ней написано что вы не правы на странице 564

Чо там пишут-то? Книгу не все читали — зоопарки не все писать умеют.

anmelegov 13.03.2012 00:40

пишут что надо использовать централизованный подход при диспетчеризации событий... могу скинуть книгу если интересно, я сам её только сегодня первый раз увидел, нашел много ответов на свои вопросы =)

Zebestov 13.03.2012 01:30

Цитата:

Сообщение от anmelegov (Сообщение 1068604)
Код AS1/AS2:

(e.target as Button).action(); // run button custom method


Что еще должна делать кнопка, кроме как предоставить возможность нажать себя и крикнуть об этом наверх?

Wolsh 13.03.2012 01:44

Цитата:

пишут что надо использовать централизованный подход...
Ну хоть не пишут, что надо все объекты кидать прямо на stage..

Котяра 13.03.2012 01:54

Код AS3:

(e.target as Button).action();

что мешает в САМОЙ кнопке сделать
Код AS3:

addEventListener(MouseEvent.CLICK, action)

Если у вас сама кнопка решает что ей делать.

Wolsh 13.03.2012 01:57

Самый красивый довод – про моментальное отключение всех кнопок удалением одного слушателя – зиждется на Вашем слабом знании Событийной модели. Я не знаю, кто Вас научил таким ужасным костылям – накрывать спрайтом, пробегаться по массивам. Есть простой кошерный метод stopPropagation(). В любой момент Вы можете полностью отрубить любому контейнеру захват мыши, и все его обитатели станут глухими.
Надеюсь, концепция что все обитатели должны сидеть в контейнере, а не разгуливать по стейджу, у Вас не вызывает возражений? Тогда пример:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                private var _sprite:Sprite;
                private var _modalSprite:Sprite;
                private var _container:Sprite;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _container = new Sprite();
                        addChild(_container);
                        //// В контейнер поместим "кнопку", одну из 128 тысяч.
                        _sprite = new Sprite();
                        _sprite.graphics.beginFill(0x000000);
                        _sprite.graphics.drawRect(0, 0, 150, 100);
                        _sprite.x = _sprite.y = 150;
                        _sprite.name = "DISABLED";
 
                        _container.addChild(_sprite);
 
                        //// А это якобы модальное окно, которое будет оставаться активным,
                        //// когда контейнер заглохнет.
                        _modalSprite = new Sprite();
                        _modalSprite.graphics.beginFill(0x008844);
                        _modalSprite.graphics.drawRect(0, 0, 100, 50);
                        addChild(_modalSprite);
                        _modalSprite.x = _modalSprite.y = 120;
                        _modalSprite.name = "MODAL";
 
                        //// Вешаем слушателей. Для наглядности я сделал один хендлер
                        //// и для спрайта в контейнере и для модального окна. Это не важно))
                        _modalSprite.addEventListener(MouseEvent.CLICK, clickHandler);
                        _sprite.addEventListener(MouseEvent.CLICK, clickHandler);
 
                        //// Внезапно: Отключаем захват клика для контейнера и всех его 128 тысяч кнопок.
                        //// _sprite с этого момента не получает события клика.
                        _container.addEventListener(MouseEvent.CLICK, clickStopper, true);
                }
 
                private function clickStopper(event:MouseEvent):void
                {
                        event.stopPropagation();
                }
 
                private function clickHandler(event:MouseEvent):void
                {
                        var s:Sprite = event.target as Sprite;
                        if (s != null) trace("Clicked", s.name);
                }
        }
}

Добавлено через 6 минут
Ну и не забываем про старый добрый
Код AS3:

_container.mouseChildren = false;

Добавлено через 14 минут
Котяра, хитрость в том что кнопка не решает, а только хранит колбэк. Если бы решала, был бы полный атас. А так сохраняется видимость контроля за происходящим – после клика только Сам Главный решает, вызывать колбэк или нет. Ну и опять же, озвученный выше довод про моментальное отключение/включение всех кнопок. Если они будут "нажиматься" сами, то автор видит лишь два костыля как остановить это.

anmelegov 13.03.2012 03:44

я уже давно сделал правильно и у меня всё работает без единого костыля... ваши доводы в пользу использования тысячи слушателей событий противоречат рекомендациям коллина мука. Я привел страницы где черным по белому написано что я прав, а вы нет.

Добавлено через 5 минут
Цитата:

Сообщение от Wolsh (Сообщение 1068652)
Самый красивый довод – про моментальное отключение всех кнопок удалением одного слушателя – зиждется на Вашем слабом знании Событийной модели. Я не знаю, кто Вас научил таким ужасным костылям – накрывать спрайтом, пробегаться по массивам. Есть простой кошерный метод stopPropagation(). В любой момент Вы можете полностью отрубить любому контейнеру захват мыши, и все его обитатели станут глухими.
Надеюсь, концепция что все обитатели должны сидеть в контейнере, а не разгуливать по стейджу, у Вас не вызывает возражений? Тогда пример:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                private var _sprite:Sprite;
                private var _modalSprite:Sprite;
                private var _container:Sprite;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        _container = new Sprite();
                        addChild(_container);
                        //// В контейнер поместим "кнопку", одну из 128 тысяч.
                        _sprite = new Sprite();
                        _sprite.graphics.beginFill(0x000000);
                        _sprite.graphics.drawRect(0, 0, 150, 100);
                        _sprite.x = _sprite.y = 150;
                        _sprite.name = "DISABLED";
 
                        _container.addChild(_sprite);
 
                        //// А это якобы модальное окно, которое будет оставаться активным,
                        //// когда контейнер заглохнет.
                        _modalSprite = new Sprite();
                        _modalSprite.graphics.beginFill(0x008844);
                        _modalSprite.graphics.drawRect(0, 0, 100, 50);
                        addChild(_modalSprite);
                        _modalSprite.x = _modalSprite.y = 120;
                        _modalSprite.name = "MODAL";
 
                        //// Вешаем слушателей. Для наглядности я сделал один хендлер
                        //// и для спрайта в контейнере и для модального окна. Это не важно))
                        _modalSprite.addEventListener(MouseEvent.CLICK, clickHandler);
                        _sprite.addEventListener(MouseEvent.CLICK, clickHandler);
 
                        //// Внезапно: Отключаем захват клика для контейнера и всех его 128 тысяч кнопок.
                        //// _sprite с этого момента не получает события клика.
                        _container.addEventListener(MouseEvent.CLICK, clickStopper, true);
                }
 
                private function clickStopper(event:MouseEvent):void
                {
                        event.stopPropagation();
                }
 
                private function clickHandler(event:MouseEvent):void
                {
                        var s:Sprite = event.target as Sprite;
                        if (s != null) trace("Clicked", s.name);
                }
        }
}

Добавлено через 6 минут
Ну и не забываем про старый добрый
Код AS3:

_container.mouseChildren = false;

Добавлено через 14 минут
Котяра, хитрость в том что кнопка не решает, а только хранит колбэк. Если бы решала, был бы полный атас. А так сохраняется видимость контроля за происходящим – после клика только Сам Главный решает, вызывать колбэк или нет. Ну и опять же, озвученный выше довод про моментальное отключение/включение всех кнопок. Если они будут "нажиматься" сами, то автор видит лишь два костыля как остановить это.

Знаю плохо, зато делаю правильно, что имхо намного важнее.. не знаю как для кого конечно, может для вас важнее использовать какой-то редкий супер костыль в кривом коде, но я перед собой такой задачи не ставлю

Добавлено через 8 минут
Цитата:

Сообщение от Котяра (Сообщение 1068650)
Код AS3:

(e.target as Button).action();

что мешает в САМОЙ кнопке сделать
Код AS3:

addEventListener(MouseEvent.CLICK, action)

Если у вас сама кнопка решает что ей делать.

мешает то что профессионалы считают этот подход не правильным и нубским, я же объяснил уже выше

Добавлено через 10 минут
Цитата:

Сообщение от Zebestov (Сообщение 1068646)
Что еще должна делать кнопка, кроме как предоставить возможность нажать себя и крикнуть об этом наверх?

это шутка или не? я не уловил что-то

TanaTiX 13.03.2012 04:00

Цитата:

я только что ради интереса открыл книжку мука и в ней написано что вы не правы на странице 564
Сократ не любил книги, т.к. с ними не получалось диалога ;)
И да, Мук не забор, но все же...

Котяра 13.03.2012 04:00

Оффтоп: не надо цитировать кучу.
Если хотите ответить - просто отвечайте.
Либо конкретику цитируйте. Всем и так понятно что вы отвечаете на вышестоящие топики.

По теме: почитайте про паттерны, ну и про MVC.
Здесь на форуме много. Потом приходите.

anmelegov 13.03.2012 04:29

Цитата:

Сообщение от Котяра (Сообщение 1068671)
Оффтоп: не надо цитировать кучу.
Если хотите ответить - просто отвечайте.
Либо конкретику цитируйте. Всем и так понятно что вы отвечаете на вышестоящие топики.

По теме: почитайте про паттерны, ну и про MVC.
Здесь на форуме много. Потом приходите.

Пролистал про MVC, в очередной раз убедился что я прав...

Bgg 13.03.2012 04:32

Цитата:

Сообщение от anmelegov (Сообщение 1068673)
Пролистал про MVC, в очередной раз убедился что я прав...

Я думаю вам пора уже свою книгу писать. Ну там делиться опытом. Свои паттерны придумать. Сейчас такая разруха: все не так, везде все не правы и пишут слишком много кода.

Zebestov 13.03.2012 04:34

Цитата:

Сообщение от anmelegov (Сообщение 1068666)
это шутка или не? я не уловил что-то

Не шутка. Для кнопки слишком функционально. Было бы странно открыть капот автомобиля — а там пусто! Ну точно — вся механика спрятана в замке зажигания!!!

Цитата:

Сообщение от anmelegov (Сообщение 1068579)
создавать слушатель событий для каждой кнопки это по индийски

Цитата:

Сообщение от gloomyBrain (Сообщение 1068593)
Ну да, switch-case на 128 кнопок куда круче

Цитата:

Сообщение от anmelegov (Сообщение 1068666)
тысячи слушателей

Здесь не аукцион вроде :quiet:

Добавлено через 2 минуты
Цитата:

Сообщение от anmelegov (Сообщение 1068673)
Пролистал про MVC, в очередной раз убедился что я прав...

Но Bgg не про этот MVC говорил!

anmelegov 13.03.2012 04:55

Цитата:

Сообщение от Bgg (Сообщение 1068675)
Я думаю вам пора уже свою книгу писать. Ну там делиться опытом. Свои паттерны придумать. Сейчас такая разруха: все не так, везде все не правы и пишут слишком много кода.

пока еще рановато.. может через год-два

Добавлено через 2 минуты
Цитата:

Сообщение от Zebestov (Сообщение 1068676)
Не шутка. Для кнопки слишком функционально. Было бы странно открыть капот автомобиля — а там пусто! Ну точно — вся механика спрятана в замке зажигания!!!

Готов выслушать ваши предложения

Zebestov 13.03.2012 11:26

Предлагаю пользоваться событиями.

anmelegov 13.03.2012 11:42

Цитата:

Сообщение от Zebestov (Сообщение 1068694)
Предлагаю пользоваться событиями.

я пользуюсь событиями

hvostoblud 13.03.2012 11:50

Может быть конечно я не прав, но по моему предложенная вами реализация имеет ту же суть, да и принцип действия что и механизм событий, так зачем дописывать еще один к уже имеющемуся?

anmelegov 13.03.2012 11:51

Цитата:

Сообщение от hvostoblud (Сообщение 1068699)
Может быть конечно я не прав, но по моему предложенная вами реализация имеет ту же суть, да и принцип действия что и механизм событий, так зачем дописывать еще один к уже имеющемуся?

это вы кому? тут 2 реализации обсуждается

hvostoblud 13.03.2012 11:53

Цитата:

Сообщение от anmelegov (Сообщение 1068700)
это вы кому? тут 2 реализации обсуждается

Это я вам. Извиняюсь, забыл процитировать.

gloomyBrain 13.03.2012 11:56

Суть предложенного состоит в том, что кнопка лишь сигнализирует, что на нее нажали (или навели, или еще что-то). А обработка этого события лежит в другом модуле, который ответственнен за логику приложения, а не его внешний вид.

Вам же не говорят что Ваш подход не работает вовсе. Он работает - это очевидно. Другое дело, что как только вы напишете в проекте ну, скажем, тысяч 10 строк кода, Вы точно столкнетесь со всеми неудобствами такого подхода. Так что - удачи, все приходит с опытом.

-De- 13.03.2012 12:03

26 к строк было, не считая полуавтоматических с ресурсами. В 95+% случаев по нажатию удобно было тупо вызывать функцию.
А у вас в каком проценте случаев на кнопке более одного обработчика?

anmelegov 13.03.2012 12:03

Цитата:

Сообщение от gloomyBrain (Сообщение 1068702)
Суть предложенного состоит в том, что кнопка лишь сигнализирует, что на нее нажали (или навели, или еще что-то). А обработка этого события лежит в другом модуле, который ответственнен за логику приложения, а не его внешний вид.

Вам же не говорят что Ваш подход не работает вовсе. Он работает - это очевидно. Другое дело, что как только вы напишете в проекте ну, скажем, тысяч 10 строк кода, Вы точно столкнетесь со всеми неудобствами такого подхода. Так что - удачи, все приходит с опытом.

всё правильно, обработка происходит в другом модуле... так и сделано... просто я не увидел ни одного аргументированного объяснения преимущества использования отдельного слушателя для каждой кнопки и ни одной причины почему нельзя делать так как сделал я (а сам я догадаться не могу потому что нуб, нет опыта и ваще)

gloomyBrain 13.03.2012 12:13

Цитата:

ни одного аргументированного объяснения преимущества использования отдельного слушателя для каждой кнопки
А этого Вам никто и не предлагал. Ежели у Вас куча кнопок, которые делают одно и то же - навесьте на них один и тот же метод-слушатель.

Еще раз - дело в том что у Вас кнопка сама что-то вызывает. В предлагаемом варианте решение о том, нужно что-то вызвать или нет принимается не в кнопке, а в контроллере.

Цитата:

А у вас в каком проценте случаев на кнопке более одного обработчика?
Не знаю... Может, я давно не делал кнопки? =)

ЗЫ
Я могу сказать только одно - я наелся коллбеками больше некуда. Факт передачи функции куда-либо по ссылке вызывает у меня тремор и желание напиться. Потому что эта передача может происходить тут, а может здесь, а может еще вооон-там. И привет - ищем по проекту что же мы можем куда-то передать и где. Я понимаю, что нормальные пацаны юзают дебагер, так что у них таких проблем нет. У меня их тоже нет, потому что у меня кнопка (и не-кнопка тоже) отсылает события.

hvostoblud 13.03.2012 12:26

Цитата:

Сообщение от gloomyBrain (Сообщение 1068709)
Еще раз - дело в том что у Вас кнопка сама что-то вызывает. В предлагаемом варианте решение о том, нужно что-то вызвать или нет принимается не в кнопке, а в контроллере.

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


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

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