gpt4 book ai didi

constructor - 如何解决 Haxe 中的 'Duplicate Constructor' 错误?

转载 作者:行者123 更新时间:2023-12-01 09:42:32 28 4
gpt4 key购买 nike

在 Haxe 中,我创建了一个名为 的类。我的类 喜欢:

class MyClass {

var score: String;

public function new (score: Int) {
this.score = Std.string(score);
}

public function new (score: String) {
this.score = score;
}
}

我需要多个构造函数,但 Haxe 不允许我这样做。它从构建阶段抛出此错误:
*.hx:*: lines * : Duplicate constructor
The terminal process terminated with exit code: 1

我怎么解决这个问题?

最佳答案

这被称为方法重载,除了 externs 之外,Haxe 不支持这种重载。 (但 might be in the future )。有多种方法可以解决这个问题。

在构造函数的情况下,一个常见的解决方法是为第二个构造函数使用静态“工厂方法”:

class MyClass {
var score:String;

public function new(score:String) {
this.score = score;
}

public static function fromInt(score:Int):MyClass {
return new MyClass(Std.string(score));
}
}

您还可以有一个接受两种参数的构造函数:
class MyClass {
var score:String;

public function new(score:haxe.extern.EitherType<String, Int>) {
// technically there's no need for an if-else in this particular case, since there's
// no harm in calling `Std.string()` on something that's already a string
if (Std.is(score, String)) {
this.score = score;
} else {
this.score = Std.string(score);
}
}
}

但是,我不推荐这种方法, haxe.extern.EitherType本质上是 Dynamic在引擎盖下,这对类型安全和性能不利。另外, EitherType从技术上讲,仅用于外部人员。

一个更类型安全但也更详细的选项是 haxe.ds.Either<String, Int> .在这里,您必须显式调用枚举构造函数: new MyClass(Left("100"))/ new MyClass(Right(100)) ,然后使用 pattern matching提取值。

abstract type支持 implicit conversions来自 StringInt也可能是一个选择:
class Test {
static function main() {
var s1:Score = "100";
var s2:Score = 100;
}
}

abstract Score(String) from String {
@:from static function fromInt(i:Int):Score {
return Std.string(i);
}
}

最后,还有 an experimental library这增加了对宏的重载支持,但我不确定它是否支持构造函数。

关于constructor - 如何解决 Haxe 中的 'Duplicate Constructor' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57836088/

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