gpt4 book ai didi

haxe - 摘要的正确使用

转载 作者:行者123 更新时间:2023-12-02 17:34:14 26 4
gpt4 key购买 nike

就在昨天,在使用了 Actionscript 3 几年后,我决定开始学习 Haxe 编程语言。今天我一直在探索抽象类型,我发现它们看起来与Java中的抽象类有很大不同。我开始了解他们所做的一些事情,但我不确定摘要的用途。 Haxe 中抽象的正确使用是什么?我什么时候应该优先使用抽象而不是类?

例如,下面是使用抽象类型的复数类型的不完整定义。我应该选择这个还是只是一个普通的类(class)?

abstract Complex({real:Float, imag:Float}) {
public function new(real:Float, imag:Float) {
this = { real: real, imag: imag };
}

public function real():Float { return this.real; }
public function imag():Float { return this.imag; }

@:op(A + B)
public static function add(lhs:Complex, rhs:Complex):Complex {
return new Complex(lhs.real() + rhs.real(), lhs.imag() + rhs.imag());
}

public function toString():String {
return real() + " + " + imag() + "i";
}
}

最佳答案

事实上,抽象与 Java 中的抽象类完全不同。 Haxe 中的抽象类型功能强大且有趣。它们的主要特征是它们是仅在编译时存在的类型。在运行时它们完全被包装类型替换。方法被转换为静态函数。在您描述的情况下,所有实例都将被具有两个字段 real 的匿名对象替换。和imag 。这是一个很好的用例吗?可能是的,因为 Complex 类型并不意味着要扩展,并且您可能想要定义一些运算符重载(就像您对加法所做的那样)。

为了使其更加轻量,您可以使用 Array<Float>作为包装类型,其中第一个元素是实部,第二个元素是虚部。

那么抽象类型有什么好处呢?

  • 它们为类型(特别是原始类型)添加语义。例如,您可以定义 abstract RGB(Int) {}借助方法和属性,始终输出非常高效的颜色编码。或者你可以有一个 abstract Path(String) {}方便地处理路径串联、相对路径等。
  • 您可以定义运算符重载。在上面的情况下,您可以执行类似 white + black 的操作并从中得到一些有意义的东西。
  • 与运算符重载类似,抽象可以定义其他类型的隐式转换。对于上面的 RGB,您可以轻松定义一个方法 fromString()将十六进制字符串解析为表示颜色的 Int。通过隐式转换,您可以执行以下操作: var color : RGB = "#669900"; thx.color 定义了很多颜色处理的抽象。
  • 它们非常适合将非常强大的枚举封装在 Haxe 中。通过抽象,您可以向枚举添加方法和属性(本身不支持任何这些)。
  • 它们非常适合包装优化的代码。抽象方法可以内联,包装类型可确保您在执行代码时不会添加任何额外的间接层。

什么不太好?或者更好的是,关于摘要我们应该了解什么?

  • 由于它们只是编译时工件,因此您无法使用运行时检查(例如: no Std.is(value, MyAbstract) )。
  • 抽象不是类,因此没有继承。

关于haxe - 摘要的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27642935/

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