scala - 使用密封特征和密封抽象类作为基类之间的区别

标签 scala akka

在尝试学习 Akka 时,我经常找到具有与此类似的类层次结构的示例:

sealed trait Message

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

但是,在 Scala docs有以下示例:

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

使用密封特征与抽象类(或本例中的密封抽象类)作为类层次结构的没有构造函数参数的基类有什么区别?使用其中一种相对于另一种有什么优势吗?

编辑:

具体来说,如果特征和抽象类都被密封,我就无法将它们扩展到文件之外,对吧?那么我也不能在Java中继承它们吗?如果是这样的话,被密封将导致 the suggested duplicate 中找到的大部分参数都被渲染。无用,因为它们引用文件外部的继承。

最佳答案

在这种特殊情况下,除了您无法扩展多个抽象类,但可以扩展多个特征之外,没有任何区别。

您应该检查其他答案(如评论中所述)以查看抽象类和特征之间的实际差异。如果您只是像本例一样使用抽象类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

关于scala - 使用密封特征和密封抽象类作为基类之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078797/

相关文章:

scala - Play Framework 类型不匹配;找到了: Int required: String

Scala 可变选项?

scala - 在 Scala 中表达有状态过滤器的功能方法

scala - 是否有任何合适的方法可以直接从 Scala Parser Combinator 生成 [jpg、png 等] 语法图(和/或 AST)?

scala - 如何使用 Scalatra 更改 AsyncResult 的 HTTP 状态代码

maven - GA 发布 Artifact akka-http 和 akka-streams 1.0 在哪里?

scala - IDEA中的SBT来源

scala - Akka 集群中的 Actor 查找

scala - 检查Scala/Akka Actor 是否已终止

json - 如何从 Scala 中的 Http 响应实体中解码自定义对象?