--- 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

Reply via email to