2009-05-07 6 views
3

Ich möchte alle Vorteile der neueren Vector-Klasse für FP10 nutzen, aber es scheint, dass es als final markiert ist.Actionscript 3.0 Die beste Option für das Unterklassieren von Vektorklassen (Flash Player 10)

Ich mache einige intensive mathematische Verarbeitung in Actionscript, und wiederholt Arrays von Zahlen. Ich habe vorher meine eigene Unterklasse von Array verwendet (ich nenne es), mit zusätzlichen Funktionen wie sum(), mean(), add(), multiply() usw. Das funktioniert sehr gut und erlaubt einige saubere OO Code. Allerdings finde ich durch Profiling, dass etwa 95% meiner Bearbeitungszeit in den Funktionen dieser Objekte auftritt. Ich brauche mehr Leistung aus diesen Arrays.

Ich möchte einen Vector verwenden, da er einige Leistungsverbesserungen bietet. Ich möchte speziell eine Vector.<Number> verwenden. Leider kann ich Vector nicht ableiten, da es als final gekennzeichnet ist.

Was ist der beste und sauberste Weg, um nachzuahmen, was ich zuvor mit einer Unterklasse von Array getan habe, zu einem Vector.<Number>?

Ich habe darüber nachgedacht, Vector.<Number> Variable anstelle meiner benutzerdefinierten Klasse und nur mit Dienstprogrammfunktionen zu manipulieren, aber das ist nicht gut OO-Design und wird ein Schmerz sein, um nicht zu erwähnen, hässlich.

+4

FYI, die Compiler (mxmlc und compc) unterstützt nicht die Definition von generischen Schreiben (. <>) Klassen, so dass es nicht möglich wäre, Vector Unterklasse selbst wenn sie nicht endgültig markiert . –

Antwort

4

Wenn das Hinzufügen zusätzlicher Funktionen keinen Zugriff auf geschützte Eigenschaften/Methoden von Vector erfordert, können Sie eine Wrapper-Klasse für den Vector erstellen. Etwas in dieser Richtung?

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 
    } 

    ... 
} 
+0

Ja, Zusammensetzung ist die andere Option, es ist die Einschränkung, dass ich einen NumericVector nicht wie einen regulären Vektor behandeln kann, zum Beispiel Iteration oder Zugriff mit den Indizes, wie 'myVec [0]'. Ich werde einige klobige Funktionen haben müssen, um Dinge wie 'myVec.set (0, newVal)' anstelle von 'myVec [0] = newVal;' oder 'myVec.get (0)' anstelle von 'myVec [0 ] '. – Kekoa

+0

Sie können dieses Verhalten tatsächlich implementieren, indem der NumericVector die Proxy-Klasse von AS3 erweitert. Ich kann nicht sagen, wie sich das auf die Geschwindigkeit auswirken wird ... – Stiggler

+0

Danke, ich war mir der Proxy-Klasse nicht bewusst, ich werde mich darum kümmern. Ich bin nicht so besorgt über die Geschwindigkeit des Hinzufügens/Änderns von Elementen in der NumericVector-Klasse. Ich bin besorgt über die Geschwindigkeit aller Hilfsfunktionen, die viele Iterationen erfordern, und diese werden direkt auf dem Vector innerhalb der Klasse ausgeführt. – Kekoa

1

Eine Möglichkeit, dieses Problem zu umgehen, könnte die as3ds (kurz für Actionscript 3 Datenstrukturen) zu bedienen. Ob sie schneller sein können als mit Vector, ich bin mir nicht sicher.

+0

Sieht aus wie eine großartige Bibliothek, danke! – Kekoa

1

Wie kommt es auf dieser Seite http://help.adobe.com/en_US/AS3LCR/Flash_10.0/Vector.html

heißt es: „Hinweis: Um diese Methode in einer Unterklasse von Vector außer Kraft setzen, die Verwendung ... args für die Parameter, wie dieses Beispiel zeigt:“

??

Bedeutet das nicht, dass Sie einen Vektor unterklassieren können?

James

+0

Sieht aus wie Flash 10 :-p –

Verwandte Themen