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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.01.2013, 16:12
uglan вне форума Посмотреть профиль Отправить личное сообщение для uglan Посетить домашнюю страницу uglan Найти все сообщения от uglan
  № 1  
Ответить с цитированием
uglan

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
По умолчанию Как получить приватную переменную из статик-функции внутри класса?

Привет!
Есть некий класс TTest.as.
Код AS3:
package {
	public class TTest {
	private var libItems:Vector.<myData> = new Vector.<myData>();
		public function TTest():void {
			super();
		}
		public static function getPriVar():void{
		trace(TTest().libItems);
		}
	}//END OF CLASS
}//END OF PACKAGE
class myData{
	public var LibName:String;
	public var LibPath:String;
}
Внутри которого есть статическая функция которую удобно вызывать из внешних классов. Проблема в том что видимость внутри данного класса у статической ф-ции ограничена и например переменную libItems она не увидит пока та не станет тоже статической. Теоретически если обращаться к ней через образец класса TTest() то ее можно прочесть, но тогда выдается ошибка:

1136: Incorrect number of arguments. Expected 1.

При том что у TTest нет никаких переменных при инициализации.
Что не так?

Добавлено через 2 минуты
Кстати, статической переменную libItems я тоже не могу сделать т.к. Вектору почему то она не нравится и вылетает другая более громоздкая ошибка о несовпадении типов.
__________________
uglan

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

Регистрация: Dec 2007
Адрес: Россия, Москва
Сообщений: 541
Отправить сообщение для TWETTI с помощью Skype™
Не уверен, но похоже здесь надо использовать синглтон.

Класс TTest:
Код AS3:
package
{
	public class TTest
	{
		private var libItems:Vector.<myData> = new Vector.<myData>();
 
		private static var _instance:TTest;
 
		public function TTest():void
		{
			if (_instance != null)
			{
				throw("Error");
			}
			_instance = this;
		}
 
		public static function getInstance():TTest
		{
			return (_instance == null) ? new TTest() : _instance;
		}
 
		public function getPriVar():Vector.<myData>
		{
			return libItems;
		}
	}
}
 
class myData
{
	public var LibName:String;
	public var LibPath:String;
}
Для доступа к libItems класса TTest напишите в любом месте:
Код AS3:
TTest.getInstance().getPriVar();
...
P.S. Соглашусь с strangedk. Я бы тоже не стал в вашем случае использовать статические методы, синглтон и т.д. Раскажите подробнее как вы хотите использовать класс TTest? Зачем всей программе знать о нем?


Последний раз редактировалось TWETTI; 08.01.2013 в 16:57.
Старый 08.01.2013, 16:53
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 3  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Полезность статики здесь сомнительна.
__________________
adobe AS3 manual

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

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
2 uglan

Статические функции работают только со статическими переменными. Никак не иначе.

Если вектор по какой-либо причине не можете сделать статическим, оберните его в класс и сделайте экземпляр этого класса-обертки статическим в вашем рабочем классе.
__________________
interplanety

Старый 08.01.2013, 17:06
uglan вне форума Посмотреть профиль Отправить личное сообщение для uglan Посетить домашнюю страницу uglan Найти все сообщения от uglan
  № 5  
Ответить с цитированием
uglan

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Цитата:
Раскажите подробнее как вы хотите использовать класс TTest? Зачем всей программе знать о нем?
Грубо говоря это хранилище всех графических данных загружаемых при инициализации приложения. Всей программе эта база нужна т.к. в любой момент может понадобится создание эксземпляров с использованием этих загруженных данных. Можно передавать переменную в каждый класс, но хочется какого-то более изящного решения. Статик был бы очень хорош если бы не такие вот неудобства.
__________________
uglan

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

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
у Hemanth Sharma видел замечательный пример с таким же статическим обращением к базе текстур, только там они еще и кешируются, путем занесения в Dictionary. А ключем выступает имя переменной.

Очень удобно выходит. Разве что я бы ключи перенес в константы.

Добавлено через 3 минуты
а вот и примерчик:
(пример для starling, но думаю суть понятна)
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.utils.Dictionary;
	import starling.textures.Texture;
 
	/**
	 * 
	 * @author hsharma
	 * 
	 */
	public class Assets
	{
		/**
		 * Background Assets 
		 */
		[Embed(source="../media/graphics/bgLayer1.jpg")]
		public static const BgLayer1:Class;
 
		[Embed(source="../media/graphics/bgWelcome.jpg")]
		public static const BgWelcome:Class;
 
		/**
		 * Texture Cache 
		 */
		private static var gameTextures:Dictionary = new Dictionary();
}
 
		public static function getTexture(name:String):Texture
		{
			if (gameTextures[name] == undefined)
			{
				var bitmap:Bitmap = new Assets[name]();
				gameTextures[name] = Texture.fromBitmap(bitmap);
			}
 
			return gameTextures[name];
		}
	}
}
__________________
adobe AS3 manual

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

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от uglan Посмотреть сообщение
Грубо говоря это хранилище всех графических данных загружаемых при инициализации приложения. Всей программе эта база нужна т.к. в любой момент может понадобится создание эксземпляров с использованием этих загруженных данных. Можно передавать переменную в каждый класс, но хочется какого-то более изящного решения. Статик был бы очень хорош если бы не такие вот неудобства.

А в чем неудобство? Сделайте обычный класс для графики. Сделайте статический экземпляр этого класса в классе основного приложения. Обращайтесь к нему (экземпляру графики) откуда хотите через Package.MyMainClass.MyGraphicClass.
__________________
interplanety

Старый 08.01.2013, 18:06
uglan вне форума Посмотреть профиль Отправить личное сообщение для uglan Посетить домашнюю страницу uglan Найти все сообщения от uglan
  № 8  
Ответить с цитированием
uglan

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Хороший пример Спасибо!
Только вот этот момент показался мне довольно хрупким
Код AS3:
if (gameTextures[name] == undefined)
{
	var bitmap:Bitmap = new Assets[name]();
	gameTextures[name] = Texture.fromBitmap(bitmap);
}
Почему он сразу не добавляет текстуры при инициализации класса? А при вызове getTexture() можно было бы просто делать проверку на наличие объекта в Dictionary.
__________________
uglan

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

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Так в этом весь фокус. Пока к текстуре не обращаются - она не будет занимать память.
А как только обратится кто-нибудь - то далее она будет браться уже из кеша.
__________________
adobe AS3 manual

Старый 08.01.2013, 18:11
uglan вне форума Посмотреть профиль Отправить личное сообщение для uglan Посетить домашнюю страницу uglan Найти все сообщения от uglan
  № 10  
Ответить с цитированием
uglan

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Цитата:
Сообщение от Korchy Посмотреть сообщение
А в чем неудобство? Сделайте обычный класс для графики. Сделайте статический экземпляр этого класса в классе основного приложения. Обращайтесь к нему (экземпляру графики) откуда хотите через Package.MyMainClass.MyGraphicClass.
Неудобство в том что вместо того чтобы городить такие пути можно просто вызвать одну переменную и увидеть все ее статические функции в подсказке(у меня IDE) Мое мнение.

Добавлено через 1 минуту
Цитата:
Сообщение от strangedk Посмотреть сообщение
Так в этом весь фокус. Пока к текстуре не обращаются - она не будет занимать память.
А как только обратится кто-нибудь - то далее она будет браться уже из кеша.
А разве время на ее воссоздание не потребуется? Задержки я имею в виду.
__________________
uglan

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

Теги
static

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

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


 


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


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