什么是Scala中sealed trait和abstract sealed class之间的具体区别?

11 浏览
0 Comments

什么是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日
0
0 Comments

除了gzm0的回答外,抽象封闭类和特质之间的另一个区别是,抽象封闭类,像任何其他类一样但不像特质,可以有构造函数参数:

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

0
0 Comments

在将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

除此以外,抽象类和特质在实践中几乎等价。在实践中,最大的区别可能只会在您关注二进制兼容性时显现出来(这有点超出了本答案的范围)。

0