【发布时间】:2015-07-01 20:46:33
【问题描述】:
密封类的主要原因似乎是这允许编译器在对这些类进行模式匹配时进行穷举搜索。假设我有用于模式匹配的数据类型。玩具示例:
sealed trait Statement
case class Assign(name: String, value: Int) extends Statement
case class Print(name: String) extends Statement
case class IfZero(name: String, thenn: Statement, els: Option[Statement]) extends Statement
case class Block(statements: List[Statement]) extends Statement
这些类的用例是通过模式匹配来使用它们:
def execute(statement: Statement): Unit = statement match {
case Assign(name, value) => ???
case Print(name) => ???
case IfZero(name, thenn, els) => ???
case Block(statements) => statements foreach { execute(_) }
}
为此,Statement trait 是 sealed,因此如果我忘记了 match 语句中的一种语句类型,编译器可以警告我。但是案例类呢?案例类不能相互继承,但特征和普通类可以。那么,密封案例类是否也是一种好习惯?如果我不这样做会出什么问题?
【问题讨论】:
-
密封你的层次结构是否是一种“好的做法”在很大程度上取决于手头的情况。要回答这个问题,您必须更多地了解您的层次结构意味着什么以及如何使用它。
标签: scala