由於這對很多人來說都是一個有趣的話題,請讓我在這裏點亮一些。
你可以用下面的方法去:
// 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