No he podido encontrar la respuesta a esto en ninguna otra pregunta. Supongamos que tengo una superclase abstracta Abstract0 con dos subclases, Concrete1 y Concrete1. Quiero poder definir en Abstract0 algo como¿Cómo usar el tipeo de Scala, los tipos abstractos, etc. para implementar un tipo de uno mismo?
def setOption(...): Self = {...}
donde Self sería el subtipo de hormigón. Esto permitiría que el encadenamiento de llamadas a setOption así:
val obj = new Concrete1.setOption(...).setOption(...)
y aún así obtener hormigón1 como el tipo inferido de obj.
Lo que no quiero es definir esto:
abstract class Abstract0[T <: Abstract0[T]]
porque hace que sea más difícil para los clientes que manejan este tipo. He intentado varias posibilidades, incluyendo un tipo abstracto:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
pero entonces es imposible de implementar setOption, porque this
en Abstract0 no tiene tipo de auto. Y usar this: Self =>
tampoco funciona en Abstract0.
¿Qué soluciones hay para este problema?
Una opción es definir, por ejemplo, 'protegida def auto = this.asInstanceOf [Auto]' 'y luego setOption def (...) = {...; self} ', pero esto se ve un poco feo ... –