【问题标题】:Proper Uses for Abstracts摘要的正确使用
【发布时间】:2014-12-24 23:07:49
【问题描述】:

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

【问题讨论】:

    标签: haxe


    【解决方案1】:

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

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

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

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

    有什么不好的?或者更好的是,我们应该了解摘要的哪些内容?

    • 由于它们只是一个编译时工件,您不能使用运行时检查(例如:没有Std.is(value, MyAbstract))。
    • 抽象不是类,所以没有继承。

    【讨论】:

    • 第一个要点让我非常满意!现在我明白为什么它们被称为“摘要”了(:
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多