2017-07-17 63 views
0

我想在Scala中繼承一個類。我的父類是如何繼承scala中的類

case class Person (name:String, age:Int, valid:Boolean) 

我的子類是

case class MarriedPerson (override val name: String, 
    override val age: Int, 
    override val valid: Boolean, 
    spouse: Person) extends Person(name, age, valid) 

當我嘗試,我得到一個錯誤說

:13: error: case class MarriedPerson has case ancestor Person, but case-to-case inheritance is prohibited. To overcome this limitation, use extractors to pattern match on non-leaf nodes.

  1. 爲什麼會出現這種情況,如何我弄在這附近得到一個case class繼承另一個case class
  2. 如果我在父類中刪除了「案件」,我得到一個錯誤說 是

    :15: error: value name overrides nothing override val name: String,

爲什麼不能在case class不是從一個普通的類在這種情況下繼承?

+0

https://stackoverflow.com/questions/12705309/scala-case-class-inheritance –

回答

1

您不能從一個案例類繼承到另一個案例類。從理論上講,它有可能從一個案例類繼承到一個非案例類,但這並不是建議的(這就是爲什麼最好讓你的案例類最終成爲一個好習慣 - 更多關於this post的主題)。

除了其他特性之外,案例類還有公開公開所有構造函數的參數。對於普通的類不會發生這種情況,這就是爲什麼要使代碼片段工作的原因,您應該在val前加上Person的所有參數。

因此,下面是有效的語法:

class Person(val name: String, val age: Int, val valid: Boolean) 

case class MarriedPerson(
    override val name: String, 
    override val age: Int, 
    override val valid: Boolean, 
    spouse: Person) extends Person(name, age, valid) 

但是,對於您的信息,它也相當普遍使用trait S表示這種情況下,它允許更大的靈活性(trait的支持多繼承)和一個稍微不那麼詳細的語法如下:

trait Person { 
    def name: String 
    def age: Int 
    def valid: Boolean 
} 

case class MarriedPerson(
    name: String, 
    age: Int, 
    valid: Boolean, 
    spouse: Person) extends Person 

如果你是爲什麼它可能在trait S中的overri定義def好奇的dden由子類中的val s,這是因爲Scala實現了Uniform Access Principle

+0

非常感謝你的解釋,但如果是這樣的話(一個案例類不能繼承另一個案例類),我們不能做嵌套案例類的模式匹配。那是對的嗎? – Srinivas

+0

您不能繼承,但您可以撰寫,這意味着您可以對嵌套的案例類進行模式匹配。但是,如果你的意思是類似於你的情況,嵌套的case類也以某種方式遞歸,那麼這種限制不會使它能夠開箱即用。然而,模式匹配可以通過提供'unapply'功能來加強。這裏是你可以在你的斯卡拉控制檯運行向您展示如何做到這一點的示例:https://gist.github.com/stefanobaghino/fb7c1a4071cc741fcb84af4ed2dc060c – stefanobaghino

+0

如果您想了解更多關於提取以及如何擴展模式匹配,你可以閱讀這篇優秀的文章:http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html – stefanobaghino