摘要的正确用途

Tim*_*ter 14 haxe

就在昨天,我决定在过去几年使用Actionscript 3之后开始学习Haxe编程语言.今天我一直在探索抽象类型,我逐渐意识到它们与Java中的抽象类有很大的不同.我开始掌握他们所做的一些事情,但我不确定用什么摘要.是什么构成了在Haxe中正确使用摘要,什么时候我应该在课堂上赞成它们?

例如,下面是使用抽象类型的复数类型的不完整定义.我更喜欢这个还是只是一个普通的课程?

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*lli 22

实际上,摘要与Java中的抽象类完全不同.Haxe中的抽象类型功能强大且有趣.它们的主要特征是它们是仅在编译时存在的类型.在运行时,它们完全被包装类型取代.方法转换为静态函数.在你描述的所有实例的情况下,将通过与这两个领域的匿名对象进行更换realimag.这是一个很好的用例吗?可能是的,因为复杂类型不是要扩展的,你可能想要定义一些运算符重载(就像你为添加做的那样).

为了使它更轻盈,你可以使用一个Array<Float>包裹类型,其中第一个元素是真实部分,第二个元素是虚构元素.

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

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

什么不太好?或者更好的是,我们应该知道什么是摘要?

  • 因为它们只是一个编译时工件,所以不能使用运行时检查(例如:否Std.is(value, MyAbstract)).
  • 摘要不是类,所以没有继承.