因为这是许多人感兴趣的一个有趣主题,所以让我来解释一下。
你可以采用以下方法:
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)
组合是一种有效且可靠的策略,您也应该考虑使用它。
如果您想知道密封特质是什么意思-它是只能在同一个文件中扩展的东西。也就是说,上面的两个case类必须在同一个文件中。这可以实现全面的编译器检查:
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
(人)了。这基本上就是Scala中Option
类的作用。
如果这对你没有影响,那么你可以将其设置为非密封类,并将案例类放入它们自己的文件中。并且也许采用组成方式。