gpt4 book ai didi

generics - 在 Haxe 中转换为通用类型

转载 作者:行者123 更新时间:2023-12-02 19:37:20 24 4
gpt4 key购买 nike

更新的问题:

我已经做了一些挖掘并研究了劳伦斯·泰勒的答案。我已经快到了,但它似乎不适用于递归包装。这是显示问题的更新的可运行代码片段(这次使用我的类,因为我不想重新定义所有内容)

New runnable code sample .

具体来说,请注意 {t : 3} (正确地)第一次绑定(bind)到公平,但同时 {t : {t : 3}} (也是正确的)绑定(bind)到一个公平的、嵌套的 {t : 3}绑定(bind)到不公平。相同的对象怎么可能t1t2绑定(bind)到Equitable第一次,但是NonEquitable第二次?


问题 v1:

我正在浏览 Haxe,并已经达到了简化为这样的程度:

interface SelfReferringInterface<X> {
public function doStuff(x : X) : Void;
}

class A {
private var x : Int;
public function new(x : Int){this.x = x;}

public function toString() {return Std.string(x);}
}

class B implements SelfReferringInterface<B> {
private var x : Int;

public function new (x : Int){this.x = x;}

public function doStuff(b : B) {
trace(this + " and " + b);
}

public function toString() { return Std.string(x);}
}

本质上,我有很多类(其中 AB 只是两个),其中一些实现了 SelfReferringInterface对他们自己(如 B 所做的那样),以及其他没有实现它的人。

然后我有一个可以包装任何类型的泛型类:

class GenericClass<T> {
private var t : T;
public function new(t : T) {this.t = t;}
}

我想向 GenericClass<T> 添加一个方法那,如果是TSelfReferringInterface 的实现将调用 doStuff,否则有一些其他默认行为:

class GenericClass<T> {
private var t : T;
public function new(t : T) {this.t = t;}

public function doStuffOrTrace(t2 : T) {
//if t instanceof SelfReferringClass, call t.doStuff(t2)
//otherwise call trace(t) and ignore t2
}
}

这样以下测试方法就会执行以下操作。

class Test {
static function main() {
new GenericClass<A>(new A(3)).doStuffOrTrace(new A(4));//Expect 3
new GenericClass<B>(new B(1)).doStuffOrTrace(new B(2));//Expect 1 and 2
}
}

正在实现doStuffOrTrace(..)有可能吗?我可以控制所有类(class),但我试图避免改变 AB使这成为可能。我可以添加到SelfReferringInterfaceGenericClass有必要的。有想法吗?


我做了一些挖掘,看来(由于协方差的使用)我宁愿 SelfReferringInterface<X>是一个typedef而不是接口(interface)。我仍然坚持实现 doStuffOrTrace(..) ,但这也许开辟了新的途径?

最佳答案

最好编写一个包含这两种情况的枚举,将其包装在抽象中,并为每种情况编写 @:from 函数,并将其用作 doStuffOrTrace 的输入。

正常使用时,调用函数会导致调用正确的抽象构造函数,然后可以在内部使用switch来区分。

*编辑

@:from static public function fromHasInterface<T>(v:SelfReferringInterface<T>):HasInterfaceOrNot<T>{
return THasInterface(v);
}
enum HasInterfaceOrNotT<T>{
THasInterface(v:SelfReferringInterface<T>);
THasNotInterface(v:Dynamic);
}

查看运行代码here

关于generics - 在 Haxe 中转换为通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38792024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com