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

sniper007 21.12.2010 16:18

проблема с наследованием
 
Возникла тут у меня проблема с наследованием. создал класс для кнопок (ButtonMain). Его наследует каждый класс для отдельной кнопки (здесь для примера BtnSound). Смотрел по дебагу, в переменную funcOnPress всё нормально записывается, но после нажатия на кнопку, когда попадаем в функцию press(event:MouseEvent), эта переменная пустая, соответственно ничего дальше не работает. Где я ошибаюсь?
Код AS3:

package buttons{
        public class ButtonMain extends MovieClip        {
 
                public var funcOnPress:Function; //callback-функция которая передается при регистрации кнопки
 
                function ButtonMain(){
                        addEventListener(MouseEvent.MOUSE_DOWN, press);
                        // добавляем слушателя на  нажатие кнопки
                }
 
                public function press(event:MouseEvent):void
                {
                        if (funcOnPress != null) funcOnPress();
                        // вызывается callback-функция которая передается при регистрации кнопки
                }
 
                // записываем,  какая функция должна вызваться, при нажатии на кнопку
                public function register(funcOnPress:Function=null):void
                {
                        if (funcOnPress != null)
                                this.funcOnPress = funcOnPress;
                }
        }
}

Код AS3:

package buttons
{
        public class BtnSound extends ButtonMain
        {
                function BtnSound()
                {
                        super();
                }
        }
}

и в основном коде происходит вызов (сама кнопка уже на сцене)
Код AS3:

this.btnSound = new BtnSound();
this.btnSound.register(clickBtnSound);
 
public function clickBtnSound():void
{
        trace("clickBtnSound");
}


Gaen 21.12.2010 17:38

Так сама кнопка уже на сцене, или вы её всё-таки создаёте, как в последнем блоке кода?

sniper007 21.12.2010 18:27

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

zuxul 21.12.2010 18:30

Конструктор вызывается во время создания кнопки на сцене.
Зачем Вам такой примитив как "funcOnPress"?, ведь есть же модель событий...

-De- 21.12.2010 18:33

Бред какой-то. Добавьте в press в конец:
trace("pressed", funcOnPress);
Что выведет?
Добавьте в register в конец
trace("registered",this.funcOnPress);
Что выведет?
Убедитесь, что выполняется именно такой код, как вы тут привели и никакого другого.

Gaen 21.12.2010 18:42

sniper007, уберите строчку
Код AS3:

this.btnSound = new BtnSound();

и все у вас заработает

sniper007 21.12.2010 20:01

Спасибо большое за ответы, всё заработало =)

Цитата:

Сообщение от zuxul (Сообщение 959019)
Конструктор вызывается во время создания кнопки на сцене.

да,про вызов конструктора что то я действительно не подумал...

Цитата:

Сообщение от zuxul (Сообщение 959019)
Зачем Вам такой примитив как "funcOnPress"?, ведь есть же модель событий...

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

zuxul 22.12.2010 10:05

Итак, в коде вы все равно где-то будете писать:
Код AS3:

myButton.funcOnPress = someOneFunction;

так почему же Вам не сделать такого:
Код AS3:

myButton.addEventListener(MouseEvent.CLICK, someOneFunction);

и у Вас не будет ограничения на вызов одной функции, в функции будет доступ к событию MouseEvent и к самой кнопке.

-De- 22.12.2010 11:00

zuxul,
1) зачем?
2) при такой записи тоже может быть доступ к событию и кнопке и даже не быть ограничения на вызов одной функции.
3) добавить параметр, приходящий в функцию легче.
4) клик надо вешать не на кнопку, а на её hitArea или как там она сейчас, так что запись ещё длиннее.

zuxul 22.12.2010 12:17

-De- не убедили...
1) зачем делать то же самое, что сделали уже в событийной модели (ведь при addEventListener функция сохраняется в какой-то массив и потом она же и вызывается).
2) в данной реализации этого ничего нет
3) чем легче? объясните.
4) можно и не на hitArea


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

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