由于这对许多人来说是一个有趣的话题,让我在这里阐明一些观点。
您可以采用以下方法:
// You can mark it as 'sealed'. Explained later.
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
)
// In code:
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 中的类所做的。
如果这对您来说无关紧要,那么您可以将其设为非密封并将案例类放入他们自己的文件中。也许还有作文。