2016-08-31 2 views
1

J'ai ce code de travail qui peut créer des instances de type quelconque. La fonction suivante rend simplement les objets de script associés à Entity. Tous les scripts héritent de BehaviorScript. Donc T peut être Walkclass Walk extends BehaviorScript {}.Types de contraintes génériques de stockage Haxe

// INSIDE OF A CLASS 

@:generic 
public static function register<T:(Constructible, BehaviorScript)>(type:Class<T>, entity:Entity):T{ 

    var script = new T(entity); 

    entity.addScript(script); 

    return script; 
} 

Je voudrais stocker les types de tous les scripts effectués par la fonction dans une carte où le type est la clé.

// 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); 

L'objectif final serait en train d'accéder aux scripts via le type, pensez getComponent<T> de l'unité (peut-être il y a une meilleure façon)

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

Y at-il une solution pour stocker les types génériques contraintes dans un conteneur?

Répondre

0

Vous pouvez utiliser le nom de la classe comme la clé de carte:

à savoir map.set(Type.getClassName(Type.getClass(scriptA)), A);

et map est de type Map<String, BehaviorScript>

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