我有一段可以创建某种类型实例的工作代码。
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);
最终目标是通过类型访问脚本,想想Unity的getComponent<T>
(也许有更好的方法)
getScript<T:BehaviorScript>(type:Class<T>):Null<T>{
return map.get(type);
}
是否存在将受约束的泛型类型存储在容器中的解决方案?
答案 0 :(得分:1)
您可以使用班级名称作为地图键:
即。 map.set(Type.getClassName(Type.getClass(scriptA)), A);
且map
的类型为Map<String, BehaviorScript>
function getScript(type:Class<T>) return map.get(Type.getClassName(type));