Форум 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=176634)

Aquahawk 15.03.2012 01:01

У вас может быть несколько таких объектов одного класса? Т.е. в разных частях программы разные такие списки с разными объектами одних и тех же классов? Если да, то dictionary лучший вариант.
А если от каждого класса создаётся только один объект, то это синглтон, и можно хранить ссылку на объект в самом классе. Вот так
Код AS3:

package  {
        public class Singleton {
                public function Singleton() {
                }
 
                private static var _instance:Singleton;
 
                public static function get instance():Singleton {
                        if (!_instance) _instance = new Singleton();
                        return _instance;                       
                }       
        }
}

Добавлено через 1 минуту
и пользовать соответственно потом
Код AS3:

Singleton.instance

.

HardCoder 15.03.2012 01:19

Aquahawk, большое спасибо за информацию. Я знаю что такое синглтон :). Только не совсем понимаю какая мне разница - хранить список в синглтоне или как статический массив в каком-нибудь служебном классе.
Например я оперирую 10-ю разными классами. Список только один. В этом списке по одному объекту каждого из этих 10-ти классов. Они не повторяются в списке. Я создал массив этих 10-ти экземпляров. Сделал этот массив как статическое свойство некоего класса. Именно статическое, так как этот список мне понадобится в любой момент и неизвестно где. Да - можно сделать синглтон, но суть не изменится от этого.
А вот за пример с Dictionary - был бы вам очень благодарен. Читал в справке про эти словари - но там слишком скудно написано и всегда бросал эту затею, так как не совсем понятно что это такое и как его юзать..

Aquahawk 15.03.2012 01:31

Код AS3:

package {
        import flash.display.Sprite;
        import flash.utils.Dictionary;
 
        public class Main extends Sprite {
 
                private var _dic:Dictionary;
 
                public function Main():void {
                        this._dic = new Dictionary();
                        this._dic[ExampleClass1] = new ExampleClass1();
                        this._dic[ExampleClass2] = new ExampleClass2();
                        this._dic[ExampleClass3] = new ExampleClass3();
 
                        test1();
                        test2();
                        test3();
                }
 
                public function test1():void {
                        (_dic[ExampleClass1] as ExampleClass1).test();
                }
 
                public function test2():void {
                        (_dic[ExampleClass2] as ExampleClass2).test();
                }
 
                public function test3():void {
                        (_dic[ExampleClass3] as ExampleClass3).test();
                }
        }
}
 
class ExampleClass1 {
        public function test():void {
                trace("obj1");
        }
}
 
class ExampleClass2 {
        public function test():void {
                trace("obj2");
        }
}
 
class ExampleClass3 {
        public function test():void {
                trace("obj3");
        }
}

Добавлено через 3 минуты
Dictionary это таблица где ключами являются сами объекты, выражаясь в терминах низкоуровневых языков, ключом является адрес ключевого объекта, а значение тоже объект. Но поскольку в as класс представлен в рантайме в виде объекта типа Class то всё хорошо работает.

Добавлено через 5 минут
А хранить я вам предлагал не список в синглтоне, а вообще не делать список. Если у вас десять таких классов то сделать каждого из них синглтоном и пусть он сам себе ссылку на свой объект и хранит. Вообще без списка, нужен объект этого класса, у него и взяли.

Добавлено через 6 минут
но словарь лучше, больше возможности для расширения.

HardCoder 15.03.2012 01:44

Aquahawk, спасибо большое. То есть, если у меня есть список экземпляров некоторых классов, то с помощью дикшнери я могу вытащить любой экземпляр по названию класса?
Код AS3:

this._dic = new Dictionary();
this._dic[ExampleClass1] = new ExampleClass1();
this._dic[ExampleClass2] = new ExampleClass2();
this._dic[ExampleClass3] = new ExampleClass3();
trace(_dic[ExampleClass1]);

Тогда мне в данном случае это подходит.
Только вот интересно, что будет если объекты повторятся?
Код AS3:

this._dic = new Dictionary();
this._dic[ExampleClass1] = new ExampleClass1();
this._dic[ExampleClass2] = new ExampleClass2();
this._dic[ExampleClass2] = new ExampleClass2();
trace(_dic[ExampleClass2]);


Aquahawk 15.03.2012 01:54

Код AS3:

this._dic[ExampleClass2] = new ExampleClass2(); // создали объект и записали по этому ключу
this._dic[ExampleClass2] = new ExampleClass2(); // создали второй объект и записали по этому же ключу

в результате этих двух строк в словаре будет одна запись с одним объектом, последним. Ссылка на тот объект который был там до этого будет потеряна и объект будет съеден GC если на него больше нет нигде ссылок. Короче дважды создадим объект, но в словаре окажется только последний. Если хочестся много объектов, то можно сгородить словарь векторов.

HardCoder 15.03.2012 01:56

Ага, ну тогда спасибо. Тема исчерпана - движемся в сторону словарей...

Aquahawk 15.03.2012 01:58

Код AS3:

package {
        import flash.display.Sprite;
        import flash.utils.Dictionary;
 
        public class Main extends Sprite {
 
                private var _dic:Dictionary;
 
                public function Main():void {
                        this._dic = new Dictionary();
                        this._dic[ExampleClass1] = new Vector.<ExampleClass1>();
                        (this._dic[ExampleClass1] as Vector.<ExampleClass1>).push(new ExampleClass1());
                        (this._dic[ExampleClass1] as Vector.<ExampleClass1>).push(new ExampleClass1());
 
                        this._dic[ExampleClass2] = new Vector.<ExampleClass2>();
                        (this._dic[ExampleClass2] as Vector.<ExampleClass2>).push(new ExampleClass2());
                        (this._dic[ExampleClass2] as Vector.<ExampleClass2>).push(new ExampleClass2());
                        (this._dic[ExampleClass2] as Vector.<ExampleClass2>).push(new ExampleClass2());
 
                        this._dic[ExampleClass3] = new Vector.<ExampleClass3>();
                        (this._dic[ExampleClass3] as Vector.<ExampleClass3>).push(new ExampleClass3());
 
                        this.test1();
                        this.test2();
                        this.test3();
                }
 
                public function test1():void {
                        for each (var exObj:ExampleClass1 in this._dic[ExampleClass1]) {
                                exObj.test();
                        }
                }
 
                public function test2():void {
                        for each (var exObj:ExampleClass2 in this._dic[ExampleClass2]) {
                                exObj.test();
                        }
                }
 
                public function test3():void {
                        for each (var exObj:ExampleClass3 in this._dic[ExampleClass3]) {
                                exObj.test();
                        }
                }
        }
}
 
class ExampleClass1 {
        public function test():void {
                trace("obj1");
        }
}
 
class ExampleClass2 {
        public function test():void {
                trace("obj2");
        }
}
 
class ExampleClass3 {
        public function test():void {
                trace("obj3");
        }
}

вот так если много хочется

Psycho Tiger 15.03.2012 11:35

Код AS3:

                        this._dic[ExampleClass1] = new Vector.<ExampleClass1>();
                        (this._dic[ExampleClass1] as Vector.<ExampleClass1>).push(new ExampleClass1());
                        (this._dic[ExampleClass1] as Vector.<ExampleClass1>).push(new ExampleClass1());
 
                        this._dic[ExampleClass2] = new Vector.<ExampleClass2>();
                        (this._dic[ExampleClass2] as Vector.<ExampleClass2>).push(new ExampleClass2());
                        (this._dic[ExampleClass2] as Vector.<ExampleClass2>).push(new ExampleClass2());
                        (this._dic[ExampleClass2] as Vector.<ExampleClass2>).push(new ExampleClass2());
 
                        this._dic[ExampleClass3] = new Vector.<ExampleClass3>();
                        (this._dic[ExampleClass3] as Vector.<ExampleClass3>).push(new ExampleClass3());

Ужас какой. А ссылки на что?

Aquahawk 15.03.2012 11:52

Psycho Tiger писал в час ночи копипастом чисто чтоб показать идею. Согласен что ужас.


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

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