2017-07-12 13 views
2

親インスタンスへのアクセスにはどのような方法がありますか?別のクラスのVectorセル?親Haxeクラスインスタンスからのオフセットを使用してVectorを使用する方法?

私の質問は、行が "??" とコメントについてです:直接

  • アクセス親ベクトルメモリ:

    class Test { 
        static function main() { 
         var a:A = new A(); 
         var b:B = new B(a, 115); 
        } 
    } 
    
    class A { 
        public var cells:haxe.ds.Vector<Float>; 
    
        public function new() { 
         cells = new haxe.ds.Vector(1000); 
        } 
    } 
    
    class B { 
        public var a:A; // the "parent" 
        public var my_offset:Int; 
        public var my_cells:haxe.ds.Vector<Float>; //?? 
    
        public function new(a:A, offset:Int) { 
         my_offset = offset; 
         my_cells[2] = 0.5; //?? actually a.cells[my_offset + 2]; 
        } 
    
    } 
    

    は、それがすることは可能ですか?

  • マクロを使用しますか?
  • 概要を使用しますか?

"Try Haxe" link

答えて

3

あなたは自動的に@:arrayAccess() methodsを定義することにより、所望のオフセットの追加、Vectorをラップabstractタイプを作成することができます。

class Main { 
    static function main() { 
     var cells = new haxe.ds.Vector(1000); 
     cells[115] = 1.5; 

     var cellsWithOffset = new VectorWithOffset(cells, 115); 
     trace(cellsWithOffset[0]); // 1.5 
    } 
} 

abstract VectorWithOffset<T>(VectorWithOffsetData<T>) { 
    public function new(vector:haxe.ds.Vector<T>, offset:Int) { 
     this = {vector: vector, offset: offset}; 
    } 

    @:arrayAccess inline function get(i:Int):T { 
     return this.vector[i + this.offset]; 
    } 

    @:arrayAccess inline function set(i:Int, v:T):T { 
     return this.vector[i + this.offset] = v; 
    } 
} 

typedef VectorWithOffsetData<T> = { 
    var vector:haxe.ds.Vector<T>; 
    var offset:Int; 
} 

注:抽象は必要ありませんが必然的に構造体をラップするために、それはクラスでもあり得る。 offsetはどこかに格納する必要があるので、Vectorを直接ラップすることはできません。また、抽象は独自のメンバー変数を持つことができません。

関連する問題