Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.10.2009, 17:54
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 1  
Ответить с цитированием
Furinax
[+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:
Код 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 из книги Колина Мука и все норм выходит. А тут почему-то эта ошибка...
Подскажите пожалуйсто че-не так, если сталкивались с таким.

Старый 11.10.2009, 18:13
elfon вне форума Посмотреть профиль Отправить личное сообщение для elfon Найти все сообщения от elfon
  № 2  
Ответить с цитированием
elfon
 
Аватар для elfon

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

Старый 11.10.2009, 18:23
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 3  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
т.е. получается придется отказаться от автоматического создания подклассов?
А еще какие-нибудь варианты есть?

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

Старый 11.10.2009, 18:25
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
public function Btn (newName:String = "Default name")
__________________
Hell is the possibility of sanity

Старый 11.10.2009, 18:32
elfon вне форума Посмотреть профиль Отправить личное сообщение для elfon Найти все сообщения от elfon
  № 5  
Ответить с цитированием
elfon
 
Аватар для elfon

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

Старый 11.10.2009, 18:43
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 6  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Цитата:
Сообщение от elfon Посмотреть сообщение
wvxvw после этого всплывёт его вторая ошибка, вызовы производных классов с параметрами.
Furinax вообще не ясно зачем тебе эти два класса. Просто сделай базовый MovieClip(а лучше Sprite), а сам класс Btn, и не надо никаких aboutBtn и contactBtn.
мой мозг еще не на стока развит в направлении AS3, чтобы понять последнее предложение.

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

Старый 11.10.2009, 18:44
alecsisk вне форума Посмотреть профиль Отправить личное сообщение для alecsisk Найти все сообщения от alecsisk
  № 7  
Ответить с цитированием
alecsisk

Регистрация: Feb 2008
Адрес: N.Novgorod
Сообщений: 80
Отправить сообщение для alecsisk с помощью ICQ
1. Наследуйтесь от Btn, в базовом классе - MovieClip (всё равно название класса и winName одинаковые )
2. Передавайте winName в качестве параметра после вызова конструктора.


Последний раз редактировалось alecsisk; 11.10.2009 в 18:48.
Старый 11.10.2009, 18:53
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 8  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Цитата:
Сообщение от alecsisk Посмотреть сообщение
1. Наследуйтесь от Btn, в базовом классе - MovieClip (всё равно название класса и winName одинаковые )
ну и тогда появляется еще один as файл, а моя задача - сократить их количество

Цитата:
Сообщение от alecsisk Посмотреть сообщение
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 не дает никаких возожностей для изменения его свойств


Последний раз редактировалось Furinax; 11.10.2009 в 19:47.
Старый 11.10.2009, 21:11
elfon вне форума Посмотреть профиль Отправить личное сообщение для elfon Найти все сообщения от elfon
  № 9  
Ответить с цитированием
elfon
 
Аватар для elfon

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

Старый 11.10.2009, 21:28
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 10  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Цитата:
Сообщение от elfon Посмотреть сообщение
Функции у тебя определены как private, это значит что они видны только в пределах класса и ниоткуда извне. Все что вызываешь за пределами класса должно быть public.
А ещё есть internal и protected, найди и почитай.
забыл, что private видны только в пределах класса. Теперь все работает. Обычно когда я обращался к параметра заданным с модификатором private у меня сразу выскакивала ошибка, а тут ничего не выскакивало и я был в растерянности. Спасибо большое за помощь!

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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