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

时间:2016-12-10 18:22:22

标签: 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中找到的大多数参数无效,因为它们引用了文件外的继承。

1 个答案:

答案 0 :(得分:8)

在这种特殊情况下,除了您不能扩展多个abstract classes之外没有任何差异,但您可以扩展多个traits

您应该检查其他答案(如评论中所述),以查看抽象类和特征之间的实际差异。如果您打算使用abstract classtrait来定义类型层次结构,就像这种情况一样,则没有差异。

E.g。你可以做到以下几点:

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