Je n'ai pas trouvé de réponse à cette question dans d'autres questions. Supposons que j'ai une superclasse abstraite Abstract0 avec deux sous-classes, Concrete1 et Concrete1. Je veux être en mesure de définir Abstrait0 quelque chose commeComment utiliser Scala cette typage, types abstraits, etc pour implémenter un type de soi?
def setOption(...): Self = {...}
où l'auto serait le sous-type de béton. Cela permettrait à des appels enchaînant à setOption comme ceci:
val obj = new Concrete1.setOption(...).setOption(...)
et toujours obtenir Concrete1 que le type de obj inférées.
Ce que je ne veux pas est de définir ceci:
abstract class Abstract0[T <: Abstract0[T]]
car il rend plus difficile pour les clients de traiter ce type. J'ai essayé diverses possibilités, y compris un type abstrait:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
mais il est impossible de mettre en œuvre setOption, parce que this
dans Abstrait0 n'a pas de type auto. Et en utilisant this: Self =>
ne fonctionne pas non plus dans Abstract0.
Quelles sont les solutions à ce problème?
Une option consiste à définir, par exemple, 'def = self protégée this.asInstanceOf [Self]' et 'def setOption (...) = {...; self} ', mais cela a l'air un peu moche ... –