2014-12-24 28 views
13

就在昨天,我决定在过去几年使用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"; 
    } 
} 

回答

22

实际上,摘要并不像Java中的抽象类。 Haxe中的抽象类型是强大而有趣的。它们的主要特征是它们是仅在编译时才存在的类型。在运行时,它们完全被包装类型所取代。方法被转换成静态函数。在您描述的情况下,您的所有实例将被具有两个字段realimag的匿名对象替代。这是一个很好的用例吗?可能是肯定的,因为一个复合类型并不意味着被扩展,你可能想要定义一些运算符重载(就像你添加的那样)。

为了使它更轻量化,您可以使用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))。
  • 摘要不是类,所以没有继承。
+0

第一个子弹点使它真的为我点击!现在我明白他们为什么被称为“摘要”(: –