代码之家  ›  专栏  ›  技术社区  ›  Rich Ashworth

scala中密封特征和抽象密封类之间的具体区别是什么?

  •  2
  • Rich Ashworth  · 技术社区  · 9 年前

    我希望在scala中定义以下代数数据类型:

    sealed trait Beat
    case object Rest extends Beat
    case object Hit extends Beat
    

    如果我将其定义为:

    abstract sealed class Beat
    case object Rest extends Beat
    case object Hit extends Beat
    

    i、 e.使用抽象的密封类而不是特征?这些定义似乎是等价的。

    2 回复  |  直到 9 年前
        1
  •  6
  •   gzm0    9 年前

    无论你把它放在(抽象)类还是特征上,sealed的含义都没有区别。所以在你的例子中,这两个例子确实(几乎)是等价的。

    当一个子类想要从另一个类继承时,抽象类和特征之间的区别就很明显了:一个类/特征总是只能扩展一个类,但可以扩展多个特征。例如:

    class SomeClass
    
    sealed trait Beat1
    abstract sealed class Beat2
    
    case object Rest1 extends SomeClass with Beat1 // ok
    case object Rest2 extends SomeClass with Beat2 // compile error
    

    否则,抽象类和特征几乎是等价的。实践中最大的差异可能只出现在您关心二进制兼容性的时候(这个答案有点超出范围)。

        2
  •  3
  •   Community CDub    7 年前

    添加到 gzm0's answer ,抽象密封类和trait之间的另一个区别是抽象密封类与任何其他类一样,但与trait不同,可以具有构造函数参数:

    abstract sealed class Duck(sound: String)
    
    case object RealDuck extends Duck("quack")
    case object RubberDuck extends Duck("squeak")