2010-01-13 19 views
9

¿Existe alguna forma más sencilla de hacerlo?Clase de caso de Scala derivada con las mismas variables miembro que la base

scala> case class A(x : Int) 
defined class A 

scala> case class B(override val x : Int, y : Int) extends A(x) 
defined class B 

Estoy extendiendo A con B y agregando una variable de miembro adicional. Sería bueno no tener que escribir override val antes de la x.

+0

Este ejemplo parece que estoy siendo un poco exigente, pero si la clase base tiene una gran cantidad de variables miembro todas las 'def's anulación empezar a sumar. – Dave

+0

Bueno, hasta donde yo sé, las clases de casos funcionan así. – F0RR

Respuesta

14

Recomiendo encarecidamente no heredar de una clase de caso. Tiene efectos sorprendentes en equals y hashCode, y ha quedado obsoleto en Scala 2.8.

En su lugar, defina x en un rasgo o en una clase abstracta.

scala> trait A { val x: Int } 
defined trait A 

scala> case class B(val x: Int, y: Int) extends A 
defined class B 

http://www.scala-lang.org/node/3289

http://www.scala-lang.org/node/1582

+0

En 2.8 no veo nada sorprendente en relación con equals/hashCode. Todas las propiedades requeridas de iguales se mantienen de la manera más intuitiva. (Las instancias con el tipo de tiempo de ejecución de 'case class A 'nunca son iguales a las instancias de' case class B', independientemente de si hay herencia involucrada). –

+12

Para ser precisos, las clases de casos no deben heredarse de otras clases de casos. Está bien (y es bastante común) permitir que una clase normal herede de una clase de caso. –

+0

Eso significa que si escribe clases de casos, efectivamente está sellando esas clases. Es un efecto secundario que no habría esperado pero tendré cuidado en el futuro. – Dave

Cuestiones relacionadas