--- In flexcoders@yahoogroups.com, "bnsmeets" <bensme...@...> wrote: > > Hi all, > > I'm wondering if it is possible to 'hack' some sort of downcasting into AS3. > The context is, that I am using a generated webservice proxy from Flex 3, and > want to be able to add custom (extra) properties to the generated > valueobjects without having to adjust the code that parses the wsdl result > into objects. > > So e.g. the webservice generates the class: > > class A > { > property A; > property B; > } > > I have my own class that is: > > class B extends A > { > property C; > } > > When i call the generated webservice "get all A's", it will return an array > of "A" objects, what I am looking for is to convert that list into "B" > objects. So the values of the properties that exist in the "A" counterpart, > filled for a new "B" instance, with an empty "C" property.
Instead of having B extend A, instead have both A and B implement Interface I. Then use the Decorator pattern (there's a current feature on this on InsideRIA http://www.insideria.com/2009/10/decorator-design-pattern.html if you don't have the book AS3 Design Patterns) to have B "wrap" an A and "reflect" the properties that I requires it to have. So package { public interface I { function get prop1():String; function set prop1(s:String):void; function get prop2():String; function set prop2(s:String):void; } } package { public class A implements I { private var _prop1:String; private var _prop2:String; public function get prop1():String { return _prop1; } public function set prop1(s:String):void { _prop1=s; } public function get prop2():String { return _prop2; } public function set prop2(s:String):void { _prop2=s; } } } package { public class B implements I { private var _a:A; private var _c:String; public function B(a:A) { _a=a; } public function get prop1():String { return _a.prop1; } public function set prop1(s:String):void { a.prop1=s; } public function get prop2():String { return a.prop2; } public function set prop2(s:String):void { a.prop2=s; } public function get c():String { return _c; } public function set c(s:String):void { _c=s; } } } Now, any code that needs type information, you'll be looking for I, not A, because a B is not an A, it "contains" an A. For more on Interfaces, check out http://www.insideria.com/2009/10/interfaces-and-dynamic-class-i.html or http://flexdiary.blogspot.com/2009/01/example-of-casting-contets-of-swfloader.html . HTH; Amy