Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как правильней организовать доступ к экземплярам класса? (http://www.flasher.ru/forum/showthread.php?t=112748)

Жень Шень 06.06.2008 18:15

Как правильней организовать доступ к экземплярам класса?
 
Вложений: 1
Привет!
Подскажите или поправьте меня, если я не прав.
Прилагаю код (упрощенный) для класса и клипа. Ставилась задача: динамически создавать экземпляры класса в котором создавался клип, с последующей загрузкой графики, рисунков, клипов и т.д. с возможностью их редактировать и управлять ими. Для этого мне нужно как-то обращаться к ним, чтоб получать свойства и менять их.
Как правильней организовать доступ к экземплярам класса? Я реализовал это через массив, но мне кажется это неуклюже. Возможно, ли по-другому это сделать?
Я ввел в класс свойство id. Может как-то посредство его?
Приложил и исходник на всякий случай.
Спасибо.

класс
Код:

class ImageViewer {
        // номер очередного контейнера
        public static var _numberpic:Number = 1;
        private var target_mc:MovieClip;
        private var container_mc:MovieClip;
        private var containerDepth:Number;
        // id объекта
        private var _id:Number;
        // отступ по X и Y
        private var _dx:Number;
        private var _dy:Number;
        // ширина и высота
        private var _w:Number;
        private var _h:Number;
        public function ImageViewer(target:MovieClip, x:Number, y:Number, w:Number, h:Number) {
                _w = w;
                _h = h;
                _dx = x;
                _dy = y;
                target_mc = target;
                _id = containerDepth=_numberpic;
                buildViewer();
        }
        // Создание клипа
        private function buildViewer():Void {
                var w = this._w;
                var h = this._h;
                container_mc = target_mc.createEmptyMovieClip("container"+containerDepth+"_mc", containerDepth);
                _numberpic++;
                container_mc._x = _dx;
                container_mc._y = _dy;
                with (container_mc) {
                        lineStyle(4, 0, 100);
                        moveTo(0, 0);
                        lineTo(w, 0);
                        lineTo(w, h);
                        lineTo(0, h);
                        lineTo(0, 0);
                }
        }
        public function get w():Number {
                return _w;
        }
        public function set w(par:Number):Void {
                _w = par;
        }
}

клип (btnPIC_btn - кнопка содать, b1_btn - кнопка вывести свойство)
Код:

import ImageViewer;
_global._picArray = [];
btnPIC_btn.onPress = function() {
        var i = ImageViewer._numberpic;
        switch (i) {
        case 1 :
                var picNext:ImageViewer = new ImageViewer(main_mc, 10, 10, 500, 400);
                break;
        case 2 :
                var picNext:ImageViewer = new ImageViewer(main_mc, 110, 210, 140, 140);
                break;
        case 3 :
                var picNext:ImageViewer = new ImageViewer(main_mc, 30, 50, 400, 50);
                break;
        }
        _picArray.push(picNext);
};
// кнопка тестирования
b1_btn.onPress = function() {
        trace(_picArray[0].w);
        trace(_picArray[1].w);
        trace(_picArray[2].w);
};


Alex_beginner 06.06.2008 20:54

Почему неуклюже, очень даже "уклюже":)!!

Волгоградец 07.06.2008 10:34

Код:

import ImageViewer;
_global._picArray = [];
btnPIC_btn.onPress = function() {
        var i = ImageViewer._numberpic;
        switch (i) {
        case 1 :
                _picArray.push (new ImageViewer(main_mc, 10, 10, 500, 400));
                break;
        case 2 :
                _picArray.push (new ImageViewer(main_mc, 110, 210, 140, 140));
                break;
        case 3 :
                _picArray.push (new ImageViewer(main_mc, 30, 50, 400, 50));
                break;
        }
};
// кнопка тестирования
b1_btn.onPress = function() {
        trace(_picArray[0].w);
        trace(_picArray[1].w);
        trace(_picArray[2].w);
};

Вот похожая тема: http://www.flasher.ru/forum/showthread.php?t=110799

silin 07.06.2008 12:32

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

class ImageViewer {
        public static var list:Array = [];
        private var target_mc:MovieClip;
        private var container_mc:MovieClip;
        private var containerDepth:Number;
        // id объекта
        private var _id:Number;
        // отступ по X и Y
        private var _dx:Number;
        private var _dy:Number;
        // ширина и высота
        private var _w:Number;
        private var _h:Number;
        public function ImageViewer(target:MovieClip, x:Number, y:Number, w:Number, h:Number) {
                _w = w;
                _h = h;
                _dx = x;
                _dy = y;
                target_mc = target;
                _id = containerDepth = list.length;
                list.push(this);
                buildViewer();
       
               
        }
        // Создание клипа
        private function buildViewer():Void {
                var w = this._w;
                var h = this._h;
                container_mc = target_mc.createEmptyMovieClip("container" + containerDepth + "_mc", containerDepth);
               
                container_mc._x = _dx;
                container_mc._y = _dy;
                with (container_mc) {
                        lineStyle(4, 0, 100);
                        moveTo(0, 0);
                        lineTo(w, 0);
                        lineTo(w, h);
                        lineTo(0, h);
                        lineTo(0, 0);
                }
        }
       
        public function get w():Number {
                return _w;
        }
        public function set w(par:Number):Void {
                _w = par;
        }
       
        public function toString():String
        {
                return "[object ImageViewer id:" + _id+"]";
        }
       
}

Код:

btnPIC_btn.onPress = function() {
        var i = ImageViewer.list.length;
        switch (i) {
        case 0 :
                var picNext:ImageViewer = new ImageViewer(main_mc, 10, 10, 500, 400);
                break;
        case 1 :
                var picNext:ImageViewer = new ImageViewer(main_mc, 110, 210, 140, 140);
                break;
        case 2 :
                var picNext:ImageViewer = new ImageViewer(main_mc, 30, 50, 400, 50);
                break;
        }
        //_picArray.push(picNext);
};
// кнопка тестирования
b1_btn.onPress = function() {
        for(var i=0;i<ImageViewer.list.length;i++){
                var inst:ImageViewer=ImageViewer.list[i];
                trace( "\ninst: " + inst+ "; width : " + inst.w );
        }
};


wvxvw 07.06.2008 14:43

Я бы делал менеджер и функцию ему типа getInstanceNum([n=instance position in array]):ImageViewer чтобы потом не нужно было перекастовать. Объекты которые будут хранится в массиве будут нетипизированы если обращаться к ним просто по номеру, а если прийдется часто обращаться - ИМХО не удобно писать каждый раз ImageViewer(_picArray[i]).w... конечно, это добавляет 1 вызов вроде как лишнего метода, но зато автокомплит будет работать и кодить будет приятнее %)


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

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