Scala 使用密封特征和密封抽象类作为基类的区别

Scala 使用密封特征和密封抽象类作为基类的区别,scala,akka,Scala,Akka,在尝试学习Akka的过程中,我经常发现类似于以下内容的类层次结构示例: sealed trait Message case class TextMessage(user: String, text: String) extends Message case class StatusMessage(status: String) extends Message 然而,也就是说,在一个例子中: abstract class Notification case class Email(sourc

在尝试学习Akka的过程中,我经常发现类似于以下内容的类层次结构示例:

sealed trait Message

case class TextMessage(user: String, text: String) extends Message
case class StatusMessage(status: String) extends Message
然而,也就是说,在一个例子中:

abstract class Notification

case class Email(sourceEmail: String, title: String, body: String) extends Notification
case class SMS(sourceNumber: String, message: String) extends Notification
case class VoiceRecording(contactName: String, link: String) extends Notification
使用密封特征与抽象类(在本例中为密封抽象类)作为基类(没有类层次结构的构造函数参数)有什么区别?使用一个比另一个有什么优势吗

编辑:


具体来说,如果trait和抽象类都是密封的,我就不能将它们扩展到文件之外,对吗?在这种情况下,我也不能在Java中继承它们?如果是这种情况,sealedness将使在中找到的大多数参数变得无用,因为它们引用的是文件外的继承。

在这种特殊情况下,除了不能扩展多个
抽象类之外,没有什么区别,但可以扩展多个
traits

您应该检查其他答案(如注释中所述),以查看抽象类和特征之间的实际差异。如果您只是想使用
抽象类
特征
来定义类型层次结构,那么就没有区别了

例如,您可以访问以下内容:

trait A
trait B

case class C(a: Int) extends A with B
但你不能这样做:

abstract class A
abstract class B

case class C(a: Int) extends A with B

如果Scala不需要支持Java互操作,它可能会是一种更简单、更好的语言。对人们来说也更容易学习。也值得一读。@yuval Itzhakov我已经熟悉了这个问题及其答案。有很多优点,但我在那里找不到我问题的答案。答案似乎集中在两种解决方案在可扩展性方面的差异上。如果trait和抽象类都是密封的,我就不能在文件之外扩展它们(或者在Java中继承它们),对吗?此外,如果没有使用构造函数参数,我认为大多数答案对于这种特殊情况都是无用的。