mep*_*eps 3 haxe inversion-of-control
我想使用模型的类或接口作为键将模型的实例存储在公共提供程序中,然后通过类引用将其弹出。我写了一些代码:
class Provider {
public function new() { }
public function set<T:Any>(instance:T, ?type:Class<T>) {
if (type == null)
type = Type.getClass(instance);
if (type != null && instance != null)
map.set(type, instance);
}
public function get<T:Any>(type:Class<T>):Null<T> {
return cast map.get(type);
}
var map = new Map<Class<Any>, Any>();
}
Run Code Online (Sandbox Code Playgroud)
... ala,甚至无法编译。可能我必须使用合格的类名作为键而不是类/接口引用?但我想保持整洁的get函数设计,该函数将类型作为参数并返回仅采用类型的对象,而无需进行其他类型转换。
我是否有可能或应该更改此问题的方法?
Class<T>
用作Map
密钥的问题经常出现,这是一个相关的讨论。天真的方法Map<Class<T>, T>
无法编译如下内容:
抽象的haxe.ds.Map没有@:to函数接受haxe.IMap <Class <Main.T>,Main.T>`
有几种解决此问题的方法:
可以使用Type
反射来获取类实例的全限定名称,然后将该名称用作a中的键Map<String, T>
:
var map = new Map<String, Any>();
var name = Type.getClassName(Main);
map[name] = value;
Run Code Online (Sandbox Code Playgroud)
为了方便起见,您可能需要一个包装器来完成此任务,例如this ClassMap
实现。
一个更简单的解决方案是通过使用空结构类型({}
)作为键类型来简单地“欺骗” Haxe以对其进行编译。这导致ObjectMap
被选为基础地图实现。
var map = new Map<{}, Any>();
map[Main] = value;
Run Code Online (Sandbox Code Playgroud)
但是,这允许您将事物用作非type的键Class<T>
,例如:
map[{foo: "bar"}] = value;
Run Code Online (Sandbox Code Playgroud)
可以通过使用以下ClassKey
摘要来解决以前方法的类型安全问题:
@:coreType abstract ClassKey from Class<Dynamic> to {} {}
Run Code Online (Sandbox Code Playgroud)
ObjectMap
由于to {}
隐式强制转换,它仍用作基础地图实现。但是,现在将结构用作键在编译时失败:
var map = new Map<ClassKey, Any>();
map[{foo: "bar"}] = value; // No @:arrayAccess function accepts arguments [...]
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
140 次 |
最近记录: |