Je voudrais avoir une classe B qui peut être étendue à deux champs par deux traits A_1 et A_2. Il est important que la classe B n'ait pas ces deux champs en elle-même, car la classe B doit aussi pouvoir être utilisée sans ces deux champs.
Ma première idée :
trait A_1 { val x: Int }
trait A_2 { val y: Int }
class B
Mais new B with A_1 with A_2
ne fonctionne pas, puisque x
y y
sont des membres abstraits et doivent être définis dans la classe B.
Ma deuxième idée :
trait A_1 { var x: Int = _}
trait A_2 { var y: Int = _}
class B
On pourrait alors définir les champs après avoir créé un objet de B :
val b = new B with A_1 with A_2
b.x = 1
b.y = 2
Cela fonctionne, mais c'est un peu laid, car les valeurs doivent être définies après coup. Cette construction rend également la classe mutable.
Ma troisième idée :
class A_1 (val x: Int)
class A_2 (val y: Int)
Mais la classe B n'est pas autorisée à étendre plusieurs classes, donc cette idée ne fonctionne pas.
Quelles sont les possibilités qui restent pour réaliser cette situation ? Y a-t-il une meilleure solution que l'idée 2. ?