Haxe存储通用约束类型

时间:2016-08-31 19:44:01

标签: generics types constraints 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);

最终目标是通过类型访问脚本,想想Unity的getComponent<T>(也许有更好的方法)

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

是否存在将受约束的泛型类型存储在容器中的解决方案?

1 个答案:

答案 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));