既然这对许多人来说是一个有趣的话题,那么让我在这里阐明一下。
您可以采用以下方法:
sealed trait Person {
def name: String
}
case class Employee(
override val name: String,
salary: Int
) extends Person
case class Tourist(
override val name: String,
bored: Boolean
) extends Person
是的,您必须重复这些字段。如果您不这样做,那么就不可能在其他问题之间实现正确的平等。
但是,您不需要重复方法/函数。
如果重复几个属性对您来说非常重要,请使用常规类,但请记住,它们不太适合FP。
另外,您可以使用合成代替继承:
case class Employee(
person: Person,
salary: Int
)
val employee = ...
println(employee.person.name)
构图也是您应该考虑的有效且合理的策略。
而且,如果您想知道密封特征是什么意思,它只能在同一文件中扩展。也就是说,以上两个案例类必须位于同一文件中。这允许详尽的编译器检查:
val x = Employee(name = "Jack", salary = 50000)
x match {
case Employee(name) => println(s"I'm $name!")
}
给出错误:
warning: match is not exhaustive!
missing combination Tourist
这真的很有用。现在,您将不会忘记处理其他类型的Person
s(人)。本质上,这就是Option
Scala中的类所做的。
如果这对您来说无关紧要,则可以使其不密封,并将案例类放入其自己的文件中。也许与组成。