Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как получить приватную переменную из статик-функции внутри класса? (http://www.flasher.ru/forum/showthread.php?t=191947)

uglan 08.01.2013 16:12

Как получить приватную переменную из статик-функции внутри класса?
 
Привет!
Есть некий класс 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 я тоже не могу сделать т.к. Вектору почему то она не нравится и вылетает другая более громоздкая ошибка о несовпадении типов.

TWETTI 08.01.2013 16:42

Не уверен, но похоже здесь надо использовать синглтон.

Класс 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? Зачем всей программе знать о нем?

strangedk 08.01.2013 16:53

Полезность статики здесь сомнительна.

Korchy 08.01.2013 16:54

2 uglan

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

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

uglan 08.01.2013 17:06

Цитата:

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

strangedk 08.01.2013 17:38

у 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];
                }
        }
}


Korchy 08.01.2013 18:03

Цитата:

Сообщение от uglan (Сообщение 1114300)
Грубо говоря это хранилище всех графических данных загружаемых при инициализации приложения. Всей программе эта база нужна т.к. в любой момент может понадобится создание эксземпляров с использованием этих загруженных данных. Можно передавать переменную в каждый класс, но хочется какого-то более изящного решения. Статик был бы очень хорош если бы не такие вот неудобства.


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

uglan 08.01.2013 18:06

Хороший пример:) Спасибо!
Только вот этот момент показался мне довольно хрупким
Код AS3:

if (gameTextures[name] == undefined)
{
        var bitmap:Bitmap = new Assets[name]();
        gameTextures[name] = Texture.fromBitmap(bitmap);
}

Почему он сразу не добавляет текстуры при инициализации класса? А при вызове getTexture() можно было бы просто делать проверку на наличие объекта в Dictionary.

strangedk 08.01.2013 18:09

Так в этом весь фокус. Пока к текстуре не обращаются - она не будет занимать память.
А как только обратится кто-нибудь - то далее она будет браться уже из кеша.

uglan 08.01.2013 18:11

Цитата:

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

Неудобство в том что вместо того чтобы городить такие пути можно просто вызвать одну переменную и увидеть все ее статические функции в подсказке(у меня IDE) :) Мое мнение.

Добавлено через 1 минуту
Цитата:

Сообщение от strangedk (Сообщение 1114332)
Так в этом весь фокус. Пока к текстуре не обращаются - она не будет занимать память.
А как только обратится кто-нибудь - то далее она будет браться уже из кеша.

А разве время на ее воссоздание не потребуется? Задержки я имею в виду.


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

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