2016-08-31 15 views
1

私はこのタイプの作業コードを使用して、ある種のインスタンスを作成できます。Haxe汎用制約タイプを格納しています

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

次の関数は、単にスクリプトオブジェクトを一部のEntityに関連付けるようにします。すべてのスクリプトはBehaviorScriptから継承します。 だからTWalkとなります。class Walk extends BehaviorScript {}です。

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

タイプがキーであるマップに、関数によって作成されたすべてのスクリプトのタイプをストアしたいと思います。最終的な目標は、タイプを経由してスクリプトにアクセスすることになる

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

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

は、容器の中に拘束されたジェネリック型を格納するソリューションがあります(多分もっと良い方法がある)ユニティのgetComponent<T>と思いますか?

答えて

0

あなたは、マップのキーとしてクラス名を使用することができます。

すなわちmap.set(Type.getClassName(Type.getClass(scriptA)), A);

mapタイプのMap<String, BehaviorScript>

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

です
関連する問題