由于这对很多人来说都是一个有趣的话题,请让我在这里点亮一些。
你可以用下面的方法去:
// 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
是的,你要复制的字段。如果你不这样做,简直不可能实现正确的平等among other problems。
但是,您不需要复制方法/函数。
如果几个属性的重复对你来说非常重要,那么使用常规类,但是请记住它们不适合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
(人)。这实际上就是Scala中的Option
类。
如果这对你并不重要,那么你可以使它不被密封,并将案例类放入他们自己的文件中。也许还有写作。
难道你不能从非案例类继承,还是扩展一个共同的特质? – Eduardo
我不确定。这些字段在祖先中定义。我想根据这些字段获得复制方法,平等等。如果我将父项声明为抽象类,将子项声明为案例类,它是否会考虑在父项中定义的帐户参数? – Andrea
我想不是,你必须在抽象父母(或特质)和目标案例类中定义道具。最后,很多人的样板,但至少键入安全 – virtualeyes