web-dev-qa-db-fra.com

Utilisation du constructeur scala pour définir la variable définie dans le trait

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?

44
Seba Kerckhof

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.

28
Didier Dupont
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.

33
Rex Kerr