Подтвердить что ты не робот

Использование конструктора scala для установки переменной, определенной в признаке

Если я правильно понимаю, черты являются наиболее близкими к интерфейсам Java, а конструкторы классов автоматически устанавливают переменные.

Но что, если у меня есть класс, который расширяет черту и имеет конструктор, который устанавливает переменную из признака, так что-то вроде:

trait Foo {
    var foo: String
}

class Bar (foo: String) extends Foo { /* ... */ }

Где я хочу, чтобы строка foo признака была установлена, когда я создаю объект Bar.

Компилятор, похоже, дает мне об этом ошибки. Каков правильный способ достижения этого?

4b9b3361

Ответ 1

Bar должен определить абстрактный var foo в Foo (будет одинаковым для a val). Это можно сделать в конструкторе

class Bar(var foo: String) extends Foo{...}

(конечно, это можно сделать и в теле Bar). По умолчанию параметры конструктора будут переданы в private val, если это необходимо, то есть, если они используются вне кода инициализации, в методах. Но вы можете заставить их пометить их val или var и, возможно, управлять видимостью, как в

class X(protected val s: String, private var i: Int)

Здесь вам понадобится общедоступный var для реализации Foo.

Ответ 2

trait Foo { var foo: String = _ }
class Bar(foo0: String) extends Foo { foo = foo0 }

Черта объявляет неинициализированный var; класс затем устанавливает его равным входному параметру.

В качестве альтернативы,

trait Foo {
  def foo: String
  def foo_=(s: String): Unit
}
class Bar(var foo: String) extends Foo {}

объявляет пару getter/setter, соответствующую foo, которые задаются классом.