使用sealed trait和sealed abstract class作为基类的区别

11 浏览
0 Comments

使用sealed trait和sealed abstract class作为基类的区别

尝试学习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

在类层次结构中,使用没有构造参数的sealed trait与抽象类(或sealed抽象类)作为基类有什么区别?使用其中一个有什么优势?

编辑:

具体来说,如果trait和抽象类都是sealed的,在文件外无法扩展它们,对吗?在这种情况下,我也无法从Java进行继承,对吗?如果是这样的话,被封存了的特性将使得建议的重复使用中的大多数参数无用,因为它们是关于文件外部的继承的。

admin 更改状态以发布 2023年5月21日
0
0 Comments

在这种情况下,除了无法继承多个抽象类,你可以继承多个特质之外,没有差别。

你应该查看其他答案(如评论中所述),了解抽象类和特质之间的实际区别。如果你只是像这种情况下使用抽象类特质来定义类型层次结构,那么没有区别。

例如,你可以做到以下事情:

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

0