Supposons que l'on souhaite créer une nouvelle classe générique, Novel[A]
. Cette classe contiendra beaucoup de méthodes utiles - c'est peut-être un type de collection - et donc vous voulez la sous-classer. Mais vous voulez que les méthodes retournent le type de la sous-classe, pas le type d'origine. Dans Scala 2.8, quelle est la quantité minimale de travail à faire pour que les méthodes de cette classe retournent la sous-classe pertinente, pas l'original? Par exemple,Structure minimale dans Scala pour les collections avec type de retour héritant
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]
Est-ce que ce changement de montant minimal si vous voulez Novel
à Covariant? (Les 2.8 collections font cela entre autres choses, mais elles jouent aussi avec les types de retour de façon plus fantaisiste (et utile) - la question est de savoir comment on peut se passer d'un framework si on veut seulement ces sous-types. -return-sous-types fonctionnalité.)
Modifier: Supposons dans le code ci-dessus que reverse
fait une copie. Si on fait une modification sur place et qu'on se retourne ensuite, on peut utiliser this.type
, mais cela ne fonctionne pas car la copie n'est pas this
.
Arjan liée à une autre question qui suggère la solution suivante:
def reverse: this.type = {
/*creation of new object*/.asInstanceOf[this.type]
}
qui se trouve essentiellement au système de type afin d'obtenir ce que nous voulons. Mais ce n'est pas vraiment une solution, parce que maintenant que nous avons menti au système de type, le compilateur ne peut pas nous aider à nous assurer que nous avons effectivement un quand nous pensons que nous le faisons. (Par exemple, nous n'aurions pas à surcharger reverse
dans l'exemple ci-dessus pour rendre le compilateur heureux, mais nos types ne seraient pas ce que nous voulions.)
Vous ne vouliez probablement pas dire les types Singleton de Scala comme exemple du cadre minimal que vous aviez en tête, je présume? Dans tous les cas, des exemples en ligne pour montrer comment il peut être utilisé peuvent être trouvés à http://scalada.blogspot.com/2008/02/thistype-for-chaining-method-calls.html. Il y a aussi un exemple sur SO qui montre comment des classes immuables peuvent être produites avec un peu de hack http://stackoverflow.com/questions/775312/why-cannot-this-type-be-used-for-new-instances –
@Arjan - Je ne voulais pas dire cela, car c'est trop limitatif. (Les méthodes de copie sont interdites, par exemple.) –