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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.08.2010, 09:50
Slip_91 вне форума Посмотреть профиль Отправить личное сообщение для Slip_91 Найти все сообщения от Slip_91
  № 1  
Ответить с цитированием
Slip_91
 
Аватар для Slip_91

Регистрация: May 2009
Сообщений: 25
По умолчанию обращение к классу документа

Такой абстрактный пример.
Есть класс "Main" – класс документа. и в лайбрари лежит мувиклип с классом "Unit".

Main.as
Код AS3:
package {
	import flash.display.Sprite;
	import flash.events.MouseEvent;
 
	public class Main extends Sprite {
		private var _n:Number;
 
		public function Main() {
			_n = 10;
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}
 
		public function get getN():Number {
			return _n;
		}
 
		public function onClick(e:MouseEvent):void {
			var newUnit:Unit = new Unit();
		}
	}
}
Unit.as
Код AS3:
package {
	import flash.display.MovieClip;
 
	public class Unit extends MovieClip {		
		public function Unit() {
			trace(Main.getN);
		}
	}
}
На строчку с trace компилятор ругаеться ошибкой:
1119: Access of possibly undefined property getN through a reference with static type Class.

Не хотел создавать отдельную тему, т.к. вопрос скорее всего ламерский) Но копания на форуме привели меня только к тому, что я обращаюсь к самому классу Main, а надо к его экземпляру. Подскажите пожалуйста, как это сделать? stage, root пробовал, не катит.

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

Регистрация: Jan 2007
Адрес: [1,1,1]
Сообщений: 135
Записей в блоге: 2
Отправить сообщение для PeTa4eK с помощью ICQ
Если ты хочешь получить то или инную переменную, функцию. Делай ее статичной.

Код AS3:
public static function get getN():Number
Так же придется и переменную _n делать статичной

Код AS3:
private static var _n:Number;
Теперь можешь получить значение
Код AS3:
 trace(Main.getN);
Или если этот класс дочерний то trace((parent as Main).getN) и не надобудет делать перменные и функции статичными.

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

Регистрация: May 2009
Сообщений: 25
Вот, точно. Со статиками пытался, но я приписывал только к переменной и меня всё равно посылали.
Спасибо!

Старый 21.08.2010, 10:53
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 4  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
что я обращаюсь к самому классу Main, а надо к его экземпляру.
Передавайте ссылку на этот экземпляр.

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

Регистрация: May 2009
Сообщений: 25
Цитата:
Передавайте ссылку на этот экземпляр
Ну вот я и хотел узнать, как она будет выглядеть?

Старый 21.08.2010, 17:12
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 6  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Код AS3:
var newUnit:Unit = new Unit(this);
Код AS3:
public function Unit(main:Main) {
	trace(main.getN);
}

Старый 21.08.2010, 17:59
Slip_91 вне форума Посмотреть профиль Отправить личное сообщение для Slip_91 Найти все сообщения от Slip_91
  № 7  
Ответить с цитированием
Slip_91
 
Аватар для Slip_91

Регистрация: May 2009
Сообщений: 25
Дошло, спс.

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

Регистрация: May 2004
Адрес: Ukraine
Сообщений: 23
Есть ещё один вариант.
Нужно в классе Main сделать статическую ссылку-переменную на саму себя:
Код AS3:
public class Main extends Sprite {
	private var _n:Number;
	public static var instance:Main;
 
	public function Main() {
		this.instance = this;
		_n = 10;
		stage.addEventListener(MouseEvent.CLICK, onClick);
	}
...
}
А теперь Unit.as будет выглядеть так:
Код AS3:
package {
	import flash.display.MovieClip;
 
	public class Unit extends MovieClip {		
		public function Unit() {
			trace(Main.instance.getN);
		}
	}
}
А вообще чтобы ты понимал: то что ты написал trace(Main...); для флеша это что? Это класс(описание класса). Это даже не объект и не свойство в Unit. А вот Main.instance - это именно объект твоего документа.

Старый 22.08.2010, 07:57
Slip_91 вне форума Посмотреть профиль Отправить личное сообщение для Slip_91 Найти все сообщения от Slip_91
  № 9  
Ответить с цитированием
Slip_91
 
Аватар для Slip_91

Регистрация: May 2009
Сообщений: 25
Цитата:
А вообще чтобы ты понимал: то что ты написал trace(Main...); для флеша это что? Это класс(описание класса). Это даже не объект и не свойство в Unit.
Ну это я вроде понял, покурив всяких манов для начинающих по ас3. Просто никак не мог догнать, как получить ссылку на экземпляр класса, который автоматом создаётся. Не привык я еще к ООП, тут не помешала бы, наверное, хорошая книжка именно по нему.

Кстати, EXFlash, если писать как в вашем примере:
Код AS3:
this.instance = this;
Компилятор опять же выдаёт ошибку №1119.
Убираю this перед instance – всё работает. Почему так? Вроде this должен как раз ссылаться на объект документа в данном случае.


Последний раз редактировалось Slip_91; 22.08.2010 в 10:11.
Старый 22.08.2010, 11:45
EXFlash вне форума Посмотреть профиль Отправить личное сообщение для EXFlash Найти все сообщения от EXFlash
  № 10  
Ответить с цитированием
EXFlash
 
Аватар для EXFlash

Регистрация: May 2004
Адрес: Ukraine
Сообщений: 23
Стыдно. Как жестко я ступил!
Естественно не this.instance! Потому что instanse - СТАТИЧЕСКИЙ ПАРАМЕТР. И это параметр Main.instance. Параметр для класса, а я написал его как для конкретного объекта this. А если написать просто instance - компилятор сам догадается, что это Main.instance.

Ну где-то так :-)


Последний раз редактировалось EXFlash; 22.08.2010 в 11:47.
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:00.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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