私はこのタイプの作業コードを使用して、ある種のインスタンスを作成できます。Haxe汎用制約タイプを格納しています
typedef Constructible = {
public function new(entity:Entity):Void;
}
次の関数は、単にスクリプトオブジェクトを一部のEntity
に関連付けるようにします。すべてのスクリプトはBehaviorScript
から継承します。 だからT
はWalk
となります。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>
と思いますか?