R – Actionscript 3.0 Best Option for Subclassing Vector Class (Flash Player 10)

actionscriptactionscript-3arraysvector

I would like to take advantage of all the goodness of the newer Vector class for FP10, but it seems it is marked as final.

I am doing some intensive mathematical processing in Actionscript, and repeatedly process arrays of Numbers. I have previously been using my own subclass of Array(I call it NumericArray), with added functions such as sum(), mean(), add(), multiply(), etc. This works very well and allows for some clean OO code. However, I am finding through profiling that about 95% of my processing time occurs in the functions of these objects. I need more performance out of these arrays.

I want to use a Vector, as it provides some performance enhancements. I want to specifically use a Vector.<Number>. Unfortunately, I cannot subclass Vector as it is marked final.

What is the best and cleanest way to imitate what I was previously doing with a subclass of Array, to a Vector.<Number>?

I have thought about passing around Vector.<Number> variables instead of my custom class and just using utility functions to manipulate, but this is not good OO design and will be a pain to use, not to mention ugly.

Best Answer

If adding your additional functionality doesn't require access to protected properties/methods of Vector, you could create a wrapper class for the Vector. Something along these lines?

import flash.utils.Proxy;
import flash.utils.flash_proxy;

use namespace flash_proxy;

public class NumericVector extends Proxy
{
     private var vector:Vector.<Number>;

     public function NumericVector(vector:Vector.<Number> = null)
     {
          if(vector == null)
          {
              this.vector = new Vector.<Number>();
          }
          else
          {
              this.vector = vector;
          }
     }

     override flash_proxy function nextName(index:int):String 
     {
         return vector[index - 1].toString();
     }

     override flash_proxy function nextNameIndex(index:int):int
     {
         // implementation
     }

     public function sum():Number
     {
         // do whatever you intend to do
     }

     ...
}
Related Topic