Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   1203: No default constructor found in base class Btn. (http://www.flasher.ru/forum/showthread.php?t=131038)

Furinax 11.10.2009 17:54

1203: No default constructor found in base class Btn.
 
Написал класс Btn. Создал в библиотеке два мувиклипа aboutBtn и contactBtn. Далее у каждого символа в Linkage properties в поле Base class написал Btn, а в поле Class написал AboutBtn и ContactBtn соответственно для каждого символа. Оба символа создаются программно на этапе выполнения в основном классе.
В итоге появляется ошибка:
1203: No default constructor found in base class Btn.

Хотя в окне Linkage properties при нажатии на кнопку Validate class definition напротив поля Base class для каждого класса определение
класса находится.

Вот код класса Btn:
Код AS3:

package {
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.events.Event;
 
        public class Btn extends MovieClip {
 
                private var goBackStarted:Boolean;
                private var win:MovieClip;
                private var winName:String;
 
                public function Btn (newName:String) {
                        winName = newName;
                        stop();
                        unblockBtn();               
                }
 
                private function rollOverHandler (e:MouseEvent):void {
                        if (goBackStarted = true) {
                                removeEventListener (Event.ENTER_FRAME, goBack);
                                }
                        gotoAndPlay ("OVER");
                }
 
                private function rollOutHandler (e:MouseEvent):void {
                        addEventListener (Event.ENTER_FRAME, goBack);
                }
 
                private function downHandler (e:MouseEvent):void {
                        blockBtn();
                        gotoAndStop ("DOWN");
                        openWin();
                }
 
                private function goBack (e:Event):void {
                        goBackStarted = true;
                        prevFrame ();
                        if (currentFrameLabel == "OVER") {
                                removeEventListener (Event.ENTER_FRAME, goBack);
                                gotoAndStop (1);
                        }
                }
 
                private function blockBtn ():void {
                        removeEventListener (MouseEvent.ROLL_OVER, rollOverHandler);
                        removeEventListener (MouseEvent.ROLL_OUT, rollOutHandler);
                        removeEventListener (MouseEvent.MOUSE_DOWN, downHandler);
                        buttonMode = false;
                }
 
                private function unblockBtn ():void {
                        goBackStarted = false;
                        buttonMode = true;
                        addEventListener (MouseEvent.ROLL_OVER, rollOverHandler);
                        addEventListener (MouseEvent.ROLL_OUT, rollOutHandler);
                        addEventListener (MouseEvent.MOUSE_DOWN, downHandler);
 
                        }
 
                private function openWin ():void {
                        if (winName == "aboutWin") {
                                win = new AboutWin;
                                win.x = 133;
                                win.y = 265;
                        parent.addChild(win);
                                } else if (winName == "contactWin") {
                                win = new ContactWin;
                                win.x = 133;
                                win.y = 265;
                                parent.addChild(win);
                                };
                        }
        }
}

А вот код функции в конструкторе основного класса, которая создает экземпляры классов AboutBtn и ContactBtn (которые по идее должны расширять Btn):
Код AS3:

private function addSymbols():void {
 
                        aboutBtn = new AboutBtn("aboutWin");
                        aboutBtn.x = 133;
                        aboutBtn.y = 158;
 
                        contactBtn = new ContactBtn("contactWin");
                        contactBtn.x = 420;
                        contactBtn.y = 158;
 
                        bcObject = new BcObject;
                        bcObject.x = 104;
                        bcObject.y = 45;
 
                        addChild (aboutBtn);
                        addChild (contactBtn);
                        addChild (bcObject);
                }

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

elfon 11.10.2009 18:13

Суть в том что два класса наследника Btn создаются автоматически с дефолтными конструкторами(без параметров), это подразумевает вызов дефолтного конструктора в базовом классе, а там только с параметрами и тут коллапс.
Надо сделать простенькие классы наследников, где будет только конструктор с параметрами и вызов базового конструктора(super).

Furinax 11.10.2009 18:23

т.е. получается придется отказаться от автоматического создания подклассов?
А еще какие-нибудь варианты есть?

Просто хочется сделать один as файл и привязать его к куче символов, просто меняя параметры в конструкторе.
такое ощущение, что до меня никто так химичить не пытался....

wvxvw 11.10.2009 18:25

Код AS3:

public function Btn (newName:String = "Default name")


elfon 11.10.2009 18:32

wvxvw после этого всплывёт его вторая ошибка, вызовы производных классов с параметрами.
Furinax вообще не ясно зачем тебе эти два класса. Просто сделай базовый MovieClip(а лучше Sprite), а сам класс Btn, и не надо никаких aboutBtn и contactBtn.

Furinax 11.10.2009 18:43

Цитата:

Сообщение от elfon (Сообщение 857000)
wvxvw после этого всплывёт его вторая ошибка, вызовы производных классов с параметрами.
Furinax вообще не ясно зачем тебе эти два класса. Просто сделай базовый MovieClip(а лучше Sprite), а сам класс Btn, и не надо никаких aboutBtn и contactBtn.

мой мозг еще не на стока развит в направлении AS3, чтобы понять последнее предложение.

Просто у меня в приложении много кнопок и к каждой кнопке по одному as файлу. Так вот этот класс Btn должен один подходить ко всем кнопкам. Но вот возникли неожиданные трудности...

alecsisk 11.10.2009 18:44

1. Наследуйтесь от Btn, в базовом классе - MovieClip (всё равно название класса и winName одинаковые :) )
2. Передавайте winName в качестве параметра после вызова конструктора.

Furinax 11.10.2009 18:53

Цитата:

Сообщение от alecsisk (Сообщение 857003)
1. Наследуйтесь от Btn, в базовом классе - MovieClip (всё равно название класса и winName одинаковые :) )

ну и тогда появляется еще один as файл, а моя задача - сократить их количество

Цитата:

Сообщение от alecsisk (Сообщение 857003)
2. Передавайте winName в качестве параметра после вызова конструктора.

тогда смысл от проверки значения winName теряется.

Уменя так было вначале, потом я пошел в сторону обобщения.

Идея заключается в том, чтобы у меня был один класс, который бы я мог связать со всем символмами кнопок в библиотеке. При это изменяя всего лишь один его параметр.
Но как вижу, автоматическое создание классов этого мне сделать не позволяет.

Добавлено через 52 минуты
Решил обойтись вообще без параметров и сделал вот так:
Код AS3:

public class Btn extends MovieClip {
 
                private var goBackStarted:Boolean;
                private var win:MovieClip;
                private var winName:String
 
                public function Btn () {
                        stop();
                        winName = "defaultName";
                        unblockBtn();               
                }
 
                private function setWinName (newName:String) {
                        winName = newName;
                        return winName;
                        }
 
                private function rollOverHandler (e:MouseEvent):void {
                        if (goBackStarted = true) {
                                removeEventListener (Event.ENTER_FRAME, goBack);
                                }
                        gotoAndPlay ("OVER");
                }
 
                private function rollOutHandler (e:MouseEvent):void {
                        addEventListener (Event.ENTER_FRAME, goBack);
                }
 
                private function downHandler (e:MouseEvent):void {
                        blockBtn();
                        gotoAndStop ("DOWN");
                        openWin();
                }
 
                private function goBack (e:Event):void {
                        goBackStarted = true;
                        prevFrame ();
                        if (currentFrameLabel == "OVER") {
                                removeEventListener (Event.ENTER_FRAME, goBack);
                                gotoAndStop (1);
                        }
                }
 
                private function blockBtn ():void {
                        removeEventListener (MouseEvent.ROLL_OVER, rollOverHandler);
                        removeEventListener (MouseEvent.ROLL_OUT, rollOutHandler);
                        removeEventListener (MouseEvent.MOUSE_DOWN, downHandler);
                        buttonMode = false;
                }
 
                private function unblockBtn ():void {
                        goBackStarted = false;
                        buttonMode = true;
                        addEventListener (MouseEvent.ROLL_OVER, rollOverHandler);
                        addEventListener (MouseEvent.ROLL_OUT, rollOutHandler);
                        addEventListener (MouseEvent.MOUSE_DOWN, downHandler);
 
                        }
 
                private function openWin ():void {
                        if (winName == "aboutWin") {
                                win = new AboutWin;
                                win.x = 133;
                                win.y = 265;
                                parent.addChild(win);
                                } else if (winName == "contactWin") {
                                win = new ContactWin;
                                win.x = 133;
                                win.y = 265;
                                parent.addChild(win);
                                };
                        }
        }

И потом решил задавать имя параметру winName через основной клас приложения:
Код AS3:

                private function addSymbols():void {
 
                        aboutBtn = new AboutBtn();
                        aboutBtn.setWinName ("aboutBtn");
                        aboutBtn.x = 133;
                        aboutBtn.y = 158;
 
                        contactBtn = new ContactBtn();
                        contactBtn.setWinName ("contactBtn");
                        contactBtn.x = 420;
                        contactBtn.y = 158;
 
                        bcObject = new BcObject;
                        bcObject.x = 104;
                        bcObject.y = 45;
 
                        addChild (aboutBtn);
                        addChild (contactBtn);
                        addChild (bcObject);
                }

Но наткнулся на новую проблему:
TypeError: Error #1006: setWinName не является функцией.
at forpage::Fproject/addSymbols()
at forpage::Fproject()

Почему setWinName не является функцией? Она же определенна в суперклассе как функция, значит должна и в подклассах работать.
Можете объяснить че тут не так?

Добавлено через 1 час 14 минут
Вообще смысл от автоматического наследования классов теряется. Получается, что поле Base class придумали чисто для того, чтобы один класс связать с кучей символов. А сделать более узкую функциональность никоим образом не получается?

Добавлено через 2 часа 14 минут
пробую даже так:
Код AS3:

                        contactBtn = new ContactBtn();
                        contactBtn.winName = "contactWin";
                        contactBtn.x = 420;
                        contactBtn.y = 158;

все равно никакой реакции. Почему то автоматическое расширение класса Btn не дает никаких возожностей для изменения его свойств:(

elfon 11.10.2009 21:11

Функции у тебя определены как private, это значит что они видны только в пределах класса и ниоткуда извне. Все что вызываешь за пределами класса должно быть public.
А ещё есть internal и protected, найди и почитай.

Furinax 11.10.2009 21:28

Цитата:

Сообщение от elfon (Сообщение 857031)
Функции у тебя определены как private, это значит что они видны только в пределах класса и ниоткуда извне. Все что вызываешь за пределами класса должно быть public.
А ещё есть internal и protected, найди и почитай.

забыл, что private видны только в пределах класса. Теперь все работает. Обычно когда я обращался к параметра заданным с модификатором private у меня сразу выскакивала ошибка, а тут ничего не выскакивало и я был в растерянности. Спасибо большое за помощь!

Добавлено через 5 минут
вот теперь все работает. Теперь моя библиотека классов стала более компактной. Круто! Символы покорились мне. Теперь я ПОВЕЛИТЕЛЬ СИМВОЛОВ! Мухахахахахахахааха! Мухахахахахахаахахаха! Мухахахахахахаха!


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

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