2 votes

Comment écrire une classe qui peut être étendue avec deux champs par deux traits ?

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. ?

6voto

Nicolas Points 11558

Tu étais si proche :

scala> trait A1 {val x: Int}
defined trait A1

scala> trait A2 {val y: Int}
defined trait A2

scala> class B
defined class B

scala> new B with A1 with A2 {val x = 4; val y = 2}
res0: B with A1 with A2 = $anon$1@2bc20611

4voto

missingfaktor Points 44003

Ce que Nicolas a suggéré.

Ou :

scala> trait A_1 { val x: Int }
trait A_2 { val y: Int }
class B
defined trait A_1
defined trait A_2
defined class B

scala> new { val x = 3; val y = 9 } with B with A_1 with A_2
res3: B with A_1 with A_2 = $anon$1@18e1b

La caractéristique utilisée ici est connue sous le nom de initialisation précoce .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X