Si je comprends bien, les traits sont la chose la plus proche de Java et les constructeurs de classes définissent automatiquement les variables.
Mais que se passe-t-il si j'ai une classe qui étend un trait et a un constructeur qui définit une variable à partir du trait, donc quelque chose comme:
trait Foo {
var foo: String
}
class Bar (foo: String) extends Foo { /* ... */ }
Où je veux que la chaîne foo
du trait soit définie lorsque je crée un objet Bar
.
Le compilateur semble me donner des erreurs à ce sujet. Quelle est la bonne façon d'y parvenir?
Bar
doit définir l'abstrait var foo
dans Foo
(serait le même pour un val
). Cela peut être fait dans le constructeur
class Bar(var foo: String) extends Foo{...}
(bien sûr, cela pourrait aussi être fait dans le corps de Bar
). Par défaut, les paramètres du constructeur seront convertis en private val
si nécessaire, c'est-à-dire s'ils sont utilisés en dehors du code d'initialisation, dans les méthodes. Mais vous pouvez forcer le comportement en les marquant val
ou var
, et éventuellement contrôler la visibilité comme dans
class X(protected val s: String, private var i: Int)
Ici, vous avez besoin d'un var
public pour implémenter Foo
.
trait Foo { var foo: String = _ }
class Bar(foo0: String) extends Foo { foo = foo0 }
Le trait déclare un var non initialisé; la classe la définit alors égale au paramètre d'entrée.
Alternativement,
trait Foo {
def foo: String
def foo_=(s: String): Unit
}
class Bar(var foo: String) extends Foo {}
déclare la paire getter/setter correspondant à un foo, qui sont définies par la classe.