2017-07-17 2 views
0

Ich versuche, eine Klasse in Scala zu erben. My Parent-Klasse istWie vererbt Klasse in Scala

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

Mein Kind Klasse ist

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

Wenn ich das versuche ich einen Fehler sagen

: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. Warum ist dies der Fall, und wie ich um dies zu erhalten case class ein anderes zu erben case class?
  2. Wenn ich den „Fall“ in der übergeordneten Klasse zu entfernen, erhalte ich eine Fehlermeldung, dass

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

Warum kann ein case class nicht von einer normalen Klasse in diesem Fall erben?

+0

https://StackOverflow.com/questions/12705309/Scala-case-class-inheritance –

Antwort

1

Sie können nicht von einer Fallklasse zur anderen erben. Theoretisch ist es möglich, von einer Fallklasse in eine Nicht-Fallklasse zu erben, aber das wird nicht empfohlen (weshalb es eine gute Übung ist, Ihre Fallklassen endgültig zu machen - mehr zum Thema in this post).

Fallklassen haben, neben anderen Besonderheiten, alle Konstruktorargumente öffentlich verfügbar zu machen. Dies ist bei normalen Klassen nicht der Fall. Deshalb sollten Sie alle Argumente von Person mit val voranstellen, damit Ihr Code-Schnipsel funktioniert.

Somit ist die folgende gültige Syntax:

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) 

jedoch zu Ihrer Information, es ist auch durchaus üblich trait s für diese Art von Situationen zu verwenden, die für eine größere Flexibilität ermöglicht (trait Unterstützung mehrere Vererbung) und eine etwas weniger ausführlich Syntax wie folgt:

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

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

Wenn Sie neugierig sind, warum es möglich ist def s in trait s zu definieren, die overri sind dden von val s in Unterklassen, weil Scala die Uniform Access Principle implementiert.

+0

Vielen Dank für Ihre Erklärung, aber wenn das der Fall ist (eine Fallklasse kann nicht eine andere Fallklasse erben), können wir nicht tun Mustervergleich bei geschachtelten Fallklassen. Ist das korrekt? – Srinivas

+0

Sie können nicht erben, aber Sie können komponieren, was bedeutet, dass Sie Mustervergleich für geschachtelte Fallklassen durchführen können. Wenn Sie jedoch etwas wie Ihren Fall meinen, wo verschachtelte Fallklassen auch irgendwie rekursiv sind, würde diese Einschränkung es nicht ermöglichen, dass sie sofort einsatzbereit ist. Die Musterübereinstimmung kann jedoch durch Bereitstellen einer "Nichtanwenden" -Funktion verbessert werden. Hier ist ein Beispiel, das Sie in Ihrer Scala-Konsole ausführen können, um Ihnen zu zeigen, wie dies funktionieren würde: https://gist.github.com/stefanobaghino/fb7c1a4071cc741fcb84af4ed2dc060c – stefanobaghino

+0

Wenn Sie mehr über Extraktoren wissen möchten und wie Sie die Mustererkennung erweitern können, können Sie das tun Lesen Sie diesen ausgezeichneten Beitrag: http://danielwestheide.com/blog/2012/11/21/the-neophytes-guide-to-scala-part-1-extractors.html – stefanobaghino