|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
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: 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); }; } } } 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 из книги Колина Мука и все норм выходит. А тут почему-то эта ошибка... Подскажите пожалуйсто че-не так, если сталкивались с таким. |
|
|||||
Регистрация: Jul 2009
Сообщений: 35
|
Суть в том что два класса наследника Btn создаются автоматически с дефолтными конструкторами(без параметров), это подразумевает вызов дефолтного конструктора в базовом классе, а там только с параметрами и тут коллапс.
Надо сделать простенькие классы наследников, где будет только конструктор с параметрами и вызов базового конструктора(super). |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
т.е. получается придется отказаться от автоматического создания подклассов?
А еще какие-нибудь варианты есть? Просто хочется сделать один as файл и привязать его к куче символов, просто меняя параметры в конструкторе. такое ощущение, что до меня никто так химичить не пытался.... |
|
|||||
Регистрация: Jul 2009
Сообщений: 35
|
wvxvw после этого всплывёт его вторая ошибка, вызовы производных классов с параметрами.
Furinax вообще не ясно зачем тебе эти два класса. Просто сделай базовый MovieClip(а лучше Sprite), а сам класс Btn, и не надо никаких aboutBtn и contactBtn. |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Цитата:
Просто у меня в приложении много кнопок и к каждой кнопке по одному as файлу. Так вот этот класс Btn должен один подходить ко всем кнопкам. Но вот возникли неожиданные трудности... |
|
|||||
1. Наследуйтесь от Btn, в базовом классе - MovieClip (всё равно название класса и winName одинаковые )
2. Передавайте winName в качестве параметра после вызова конструктора. Последний раз редактировалось alecsisk; 11.10.2009 в 18:48. |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Цитата:
Цитата:
Уменя так было вначале, потом я пошел в сторону обобщения. Идея заключается в том, чтобы у меня был один класс, который бы я мог связать со всем символмами кнопок в библиотеке. При это изменяя всего лишь один его параметр. Но как вижу, автоматическое создание классов этого мне сделать не позволяет. Добавлено через 52 минуты Решил обойтись вообще без параметров и сделал вот так: 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); }; } } 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 минут пробую даже так: все равно никакой реакции. Почему то автоматическое расширение класса Btn не дает никаких возожностей для изменения его свойств Последний раз редактировалось Furinax; 11.10.2009 в 19:47. |
|
|||||
Регистрация: Jul 2009
Сообщений: 35
|
Функции у тебя определены как private, это значит что они видны только в пределах класса и ниоткуда извне. Все что вызываешь за пределами класса должно быть public.
А ещё есть internal и protected, найди и почитай. |
|
|||||
[+1 02.09.15]
Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
|
Цитата:
Добавлено через 5 минут вот теперь все работает. Теперь моя библиотека классов стала более компактной. Круто! Символы покорились мне. Теперь я ПОВЕЛИТЕЛЬ СИМВОЛОВ! Мухахахахахахахааха! Мухахахахахахаахахаха! Мухахахахахахаха! |
Часовой пояс GMT +4, время: 20:39. |
|
« Предыдущая тема | Следующая тема » |
|
|