2017-07-12 1 views
2

Welche Methoden sind verfügbar, um auf die Elterninstanzvektorzelle einer anderen Klasse zuzugreifen?Wie Vector mit Offset von übergeordneten Haxe-Klasseninstanz verwenden?

Meine Frage bezieht sich auf die Linien mit "??" kommentiert:

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]; 
    } 

} 

Ist es möglich: direkt

  • Zugang Eltern Vector-Speicher?
  • Verwenden Sie ein Makro?
  • Verwenden Sie eine Zusammenfassung?

"Try Haxe" link

Antwort

3

Sie könnten eine abstract Art erstellen, die eine Vector Wraps, automatisches Hinzufügen der durch die Definition @:arrayAccess() methods gewünschte Offset:

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

Hinweis: die abstrakte braucht nicht um eine Struktur zu umhüllen, könnte es auch eine Klasse sein. Sie können Vector jedoch nicht direkt umbrechen, da die offset irgendwo gespeichert werden muss und Abstracts keine eigenen Membervariablen haben können.

Verwandte Themen