什么是Scala中sealed trait和abstract sealed class之间的具体区别?
什么是Scala中sealed trait和abstract sealed class之间的具体区别?
我想在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
也就是使用一个抽象的密封类而不是特质?这两种定义似乎等价。
admin 更改状态以发布 2023年5月24日
除了gzm0的回答外,抽象封闭类和特质之间的另一个区别是,抽象封闭类,像任何其他类一样但不像特质,可以有构造函数参数:
abstract sealed class Duck(sound: String) case object RealDuck extends Duck("quack") case object RubberDuck extends Duck("squeak")
在将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
除此以外,抽象类和特质在实践中几乎等价。在实践中,最大的区别可能只会在您关注二进制兼容性时显现出来(这有点超出了本答案的范围)。