Supongamos que se quiere construir una nueva clase genérica, Novel[A]
. Esta clase contendrá muchos métodos útiles, tal vez sea un tipo de colección, y por lo tanto desea subclasificarla. Pero desea que los métodos devuelvan el tipo de la subclase, no el tipo original. En Scala 2.8, ¿cuál es la cantidad mínima de trabajo que uno tiene que hacer para que los métodos de esa clase devuelvan la subclase relevante, no la original? Por ejemplo,Marco mínimo en Scala para colecciones con tipo de retorno heredado
class Novel[A] /* What goes here? */ {
/* Must you have stuff here? */
def reverse/* What goes here instead of :Novel[A]? */ = //...
def revrev/*?*/ = reverse.reverse
}
class ShortStory[A] extends Novel[A] /* What goes here? */ {
override def reverse: /*?*/ = //...
}
val ss = new ShortStory[String]
val ss2 = ss.revrev // Type had better be ShortStory[String], not Novel[String]
cambia esto mínima cantidad si desea que se Novel
covariante?
(Las colecciones 2.8 lo hacen entre otras cosas, pero también juegan con tipos de devolución de formas más sofisticadas (y útiles); la pregunta es qué tan poco marco se puede lograr si uno solo quiere estos subtipos-siempre -return-subtítulos función.)
Editar: Suponga en el código anterior que reverse
hace una copia. Si se realiza una modificación in situ y luego se devuelve, se puede usar this.type
, pero eso no funciona porque la copia no es this
.
Arjan vinculada a otra pregunta que sugiere la siguiente solución:
def reverse: this.type = {
/*creation of new object*/.asInstanceOf[this.type]
}
que básicamente se encuentra al sistema de tipos con el fin de conseguir lo que queremos. Pero esta no es realmente una solución, porque ahora que hemos mentido al sistema de tipos, el compilador no puede ayudarnos a asegurarnos de que realmente haga obtener un ShortStory
cuando creemos que lo hacemos. (Por ejemplo, no tendríamos que anular reverse
en el ejemplo anterior para hacer que el compilador sea feliz, pero nuestros tipos no serían lo que queríamos)
Probablemente no se refirió a los tipos Singleton de Scala como un ejemplo del marco mínimo que tenía en mente, supongo? En cualquier caso, ejemplos en línea para mostrar cómo se puede utilizar se pueden encontrar en http://scalada.blogspot.com/2008/02/thistype-for-chaining-method-calls.html. También hay un ejemplo en SO que muestra cómo se pueden producir clases inmutables con algunos hackers http://stackoverflow.com/questions/775312/why-cannot-this-type-be-used-for-new-instances –
@Arjan - No quise decir eso, ya que eso es demasiado limitante. (Los métodos de copia están prohibidos, por ejemplo). –