ClassUtils – cоздание экземпляров класса

Flex cookbook entry: How to create class instance with argument list.

Недавно видел на одном блоге запись на эту тему и решил поделится своим решением. Запостил в комментариях, но автор блога не смог подтвердить(премодерация) мои комментарии сославшись на неисправность в движке сайта. Теперь у меня есть сободное место для размещения всех велосипедов. Класс aw.utils.ClassUtils.as. Описание методов можно найти в ASDoc комментариях этого класса. Примеры: Создание экземпляра класса по ссылке на объект класса.

import aw.utils.*;
import flash.display.*;
var cls:Class = BitmapData;
var bmp:BitmapData = ClassUtils.call(cls, 5, 5, false, 0xff0000) as BitmapData;
this.addChild(ClassUtils.apply(Bitmap, [bmp, PixelSnapping.AUTO, false]) as DisplayObject);

Два способа создания экземпляра класса по его имени.

import flash.display.*;
import aw.utils.ClassUtils;
var className:String = 'flash.display.BitmapData';
var bmp1:Bitmap = new Bitmap(
 	ClassUtils.callByName(className, 100, 100, false, 0xff0000)
);
var args2:Array = [100, 100, false, 0x00ff00];
var bmp2:Bitmap = new Bitmap(
 	ClassUtils.applyByName(className, args2)
);
bmp2.y = 100;
this.addChild(bmp1);
this.addChild(bmp2);

Метки: , ,

Комментарии (4) на «ClassUtils – cоздание экземпляров класса»

  1. Jloa:

    Действительно велосипед.
    А в чем смысл класса ClassUtils ?
    Мне проще написать:

    var className:Object = getDefinitionByName(«Array»);
    var myArray:* = new className();
    myArray.push(1,2,3,4)
    trace(myArray,myArray.length);

  2. a_[w]:

    Вообще, проще написать:
    var arr:Array = [0,1,2,3,4];

    А для объекта:
    var obj:Object = {a:0, b:1, c:2};

    соответственно.
    Просто класс используется для доставания эклемпляров классов по именам. И удобство заключается в том, что можно используя один метод создать экземляр с любым кол-вом параметров в конструкторе вместо обычного:

    import flash.system.*;
    car cls:Class;
    var appd:ApplicationDomain = ApplicationDomain.currentDomain;
    if(appd.hasDefinition(CLASS_NAME)){
    cls = appd.getdefinition(CLASS_NAME);
    }else throw new Error(‘…’);
    var obj = new cls(param1, param2, param3, …paramN);

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

    Да, это действительно жоский велосипед. :-D

  3. [...] блог Велосипеды ручной сборки. « Создание двух/трёх членов класса с одним именем Дополнительные возможности фильтрации с помощью E4X [...]

  4. [...] Я опробовал разные методы подстановки, но ничего не получилось. Но нашёл другой путь и тут же расширил класс aw.utils.ClassUtils(упоминался ранее). [...]

Добавить комментарий

Вы должны авторизоваться для отправки комментария.