在尝试学习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
使用密封特征与抽象类(或本例中的密封抽象类)作为没有类层次结构的构造函数参数的基类有什么区别?使用一个优于另一个有一些优势吗?
Edit:
具体来说,如果两者,特征和抽象类都被密封,我可以在Java中继承它们吗?如果是这样的话,密封性将使the suggested duplicate中找到的大多数参数无效,因为它们引用了文件外的继承 .
1 回答
在这种特殊情况下,没有区别,除了你不能扩展多个
abstract classes
,但你可以扩展多个traits
.您应该检查其他答案(如评论中所述),以查看抽象类和特征之间的实际差异 . 如果您打算使用
abstract class
或trait
来定义类型层次结构,就像这种情况一样,则没有区别 .例如 . 你可以做到以下几点:
但你做不到: