Tengo dos clases de casos que heredan de una clase base abstracta. Quiero definir algunos métodos en la clase base abstracta que usan los métodos de copia en las clases de casos heredadas (y así devolver una instancia de la clase hija). ¿Hay alguna manera de hacer esto usando self types?Scala: ¿Hay alguna manera para que una clase principal acceda a los métodos definidos solo por los niños?
código Ejemplo:
abstract class BaseClass(a: String, b: Int) {
this: case class => //not legal, but I'm looking for something similar
def doubleB(newB: Int) = this.copy(b = b * 2) //doesn't work because BaseClass has no copy
}
case class HasC(a: String, b: Int, c: Boolean) extends BaseClass(a, b) {
def doesStuffWithC(newC: Boolean) = {
...
}
}
case class HasD(a: String, b: Int, D: Double) extends BaseClass(a, b) {
def doesStuffWithD(newD: Double) = {
...
}
}
he descubierto la manera de obtener el resultado que quiero gracias a esta pregunta: How to use Scala's this typing, abstract types, etc. to implement a Self type? pero implica la adición de un método makeCopy a BaseClass y la sustituya por una llamada a copie en cada una de las clases de casos del niño, y la sintaxis (especialmente para el tipo de uno mismo) es bastante confusa. ¿Hay alguna manera de hacer esto con la autodescripción incorporada de Scala?
Alguien respondió que todas las clases de caso extienden 'Producto', lo cual es cierto, pero se eliminó, presumiblemente porque' copy' no está definido en 'Product', por lo que no funciona para usarlo para el tipo propio. El documento de "Producto" dice "todas las clases de casos implementan el Producto con métodos sintéticamente generados", ¿significa eso que no tengo suerte? –