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

pexxcrt2  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(124)

在尝试学习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中继承它们?如果是这种情况,密封会使建议的重复中的大多数参数变得无用,因为它们引用了文件外的继承。

wgx48brx

wgx48brx1#

在这个特定的例子中,除了不能扩展多个abstract classes,但是可以扩展多个traits之外,没有什么区别。
你应该检查其他的答案(如评论中提到的),看看抽象类和trait之间的实际区别。如果你只是打算像本例中那样使用abstract classtrait来定义类型层次结构,那么就没有区别了。
例如,您可以更改为:

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

相关问题