【问题标题】:Haxe Storing Generic Constraint TypesHaxe 存储通用约束类型
【发布时间】:2016-08-31 19:44:01
【问题描述】:

我有这段工作代码可以创建某种类型的实例。

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&lt;T&gt;(也许有更好的方法)

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

有没有在容器中存储受限泛型类型的解决方案?

【问题讨论】:

    标签: generics types constraints haxe


    【解决方案1】:

    您可以使用类名作为映射键:

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

    map 的类型为Map&lt;String, BehaviorScript&gt;

    function getScript(type:Class&lt;T&gt;) return map.get(Type.getClassName(type));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多