2016-08-31 10 views
1

Ich habe diesen Teil des Arbeitscodes, der Instanzen eines Typs erstellen kann.Haxe Speichern generischer Constraint-Typen

typedef Constructible = { 
    public function new(entity:Entity):Void; 
} 

Die folgende Funktion einfach macht Script-Objekte zu einem gewissen Entity verbunden. Alle Skripts erben von BehaviorScript. So T kann Walk sein, wo class Walk extends BehaviorScript {}.

Ich möchte die Typen aller Skripts speichern, die von der Funktion in einer Karte erstellt werden, wo der Typ der Schlüssel ist.

// Walk, Attack, Evade classes extend from BehaviorScript 

var e = createEntity(); 
var scriptA = register(Walk, e); 
var scriptB = register(Attack, e); 
var scriptC = register(Evade, e); 

// ISSUE: what to put as key? 
var map = new Map<?type as key?, BehaviorScript>(); 

map.set(Type.getClass(scriptA), scriptA); 
map.set(Type.getClass(scriptB), scriptB); 
map.set(Type.getClass(scriptC), scriptC); 

Das Endziel wäre die Skripte über Art zugreifen, denken Sie an getComponent<T> Unity (vielleicht gibt es eine bessere Art und Weise)

getScript<T:BehaviorScript>(type:Class<T>):Null<T>{ 
    return map.get(type); 
} 

Gibt es eine Lösung beschränkt generische Typen in einem Behälter zu speichern?

Antwort

0

Sie können den Klassennamen als Schlüsselkarte verwenden:

heißt map.set(Type.getClassName(Type.getClass(scriptA)), A);

und map vom Typ Map<String, BehaviorScript>

function getScript(type:Class<T>) return map.get(Type.getClassName(type));