poniedziałek, 13 sierpnia 2007

Dynamiczne tworzenie instancji

Pracując nad przeglądarką multimediów zauważyłem że trzeba wywoływać dynamicznie klasy i ich instancje. Pomyślałem że trzeba całkiem odejść od myślenia i pisania tradycyjnego kodu ActionScript 1.0 czy 2.0. W tym momencie trafiłem na fajny wpis na blogu Kelly Brown z jej przykładem

import flash.utils.getDefinitionByName;

private function addButton():void{
var className:String="mx.controls.Button";
var ClassReference:Class = getDefinitionByName(className) as Class;
var instance:Object = new ClassReference();

instance.label="Test"
this.addChild(DisplayObject(instance));
}


Jest więcej pisania kodu, ale kod jest bardziej elastyczny.
Podobnie rzecz sie ma z inspekcja kodu o czym pisze Eric Cancil
jego introspekcją czy refleksją za pomocą takiego kodu

import flash.utils.describeType;
var simpleInstance = new SimpleClass();
trace(describeType(simpleInstance));


Czasami też przydają się dynamiczne klasy. Są to klasy do których można dodawać nowe pola i metody po utworzeniu ich instancji.

dynamic class Person {
var name:String;
}
Person p= new Person();
p.name=”Joe”;
p.age=25;
p.printMe = function () {
trace (p.name, p.age);
}
p.printMe(); // Joe 25

Nie polecam jednak częstego stosowania dynamicznych klas. Są one bardzo mało wydajne.

Jak zrobić identyczny klon obiektu zamiast jego na nowo wywoływania ? Nie obejdzie sie z jego "zripowaniem" jak to pokazał niko na swoim blogu

4 komentarze:

sema pisze...

Dla mnie klasy dynamiczne są niezbyt przyjazne. Mozliwosc "znienacka" rozszerzenia danej klasy ( metoda, pole ) powoduje że projektowanie i OOP bierze w łeb na starcie. W UML masz klasę z 3 metodami, a w kodzie w róźnych miejscach dolepiasz kolejne 3 i masz bałagan. Tak się nie da moim zdaniem.

maliboo pisze...

Mile przy mapowaniu z XML:
<myObj className="com.adobe.SomeClass"/>

Radek pisze...

Wydaje mi, ze lepiej byloby od razu zainteresowac sie czyms do IoC i dependency injection szczegolnie, ze juz istnieja kompletne rozwiazania dla AS3.

Michał Małaj pisze...

@ Radek: świetna rada, wezmę to pod uwagę. Myślę, ze przydałoby się jakieś wprowadzenie do tego tematu
IoC i DI w AS3

@ Sema: klasy dynamiczne są dla leniwych i dla tych którzy nie zaplanują sobie API aplikacji.