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

13

在尝试学习Akka时,我经常遇到类层次结构类似于以下内容的示例:

sealed trait Message

case class TextMessage(user: String, text: String) extends Message
case class StatusMessage(status: String) extends Message

然而,在Scala文档中,有以下示例:

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

在类层次结构中,使用带有无构造函数参数的密封特质(sealed trait)与抽象类(或者在这种情况下是密封抽象类)作为基类有何区别?使用其中一个是否比另一个有优势?

编辑:

具体来说,如果特质和抽象类都是被密封的,那么我就不能在文件外扩展它们,对吧?在这种情况下,我也不能从Java继承它们,对吗?如果是这种情况,被密封的特性将使得在建议的重复问题中发现的大多数论点失去意义,因为它们都涉及文件之外的继承。


3
可能是[使用抽象类的优势与使用特质的区别是什么?]的重复问题。 - Yuval Itzchakov
1
如果Scala不需要支持Java互操作性,那么它本来可以是一种更简单、更好的语言。这也会让人们更容易学习。 - user3248346
这篇文章也值得一读。 - jwvh
@yuval-itzchakov 我已经熟悉了那个问题及其答案。有很多好的观点,但我在那里找不到我的问题的答案。答案似乎侧重于两种解决方案的可扩展性差异。如果 trait 和抽象类都被封闭,我不能在文件外扩展它们(或在 Java 中继承它们),对吗?此外,如果没有使用构造函数参数,我认为大多数答案对这种特殊情况毫无用处。 - vaiski
1个回答

13
在这种特定情况下,除了你无法扩展多个抽象类之外,没有其他区别,但你可以扩展多个 traits。
你应该查看其他答案(如评论中所提到的)以了解抽象类和 trait 之间的实际差异。如果您只是像本例中一样使用抽象类或 trait 来定义类型层次结构,则没有任何区别。
例如,你可以执行以下操作:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接