Использование конструктора scala для установки переменной, определенной в признаке
Если я правильно понимаю, черты являются наиболее близкими к интерфейсам Java, а конструкторы классов автоматически устанавливают переменные.
Но что, если у меня есть класс, который расширяет черту и имеет конструктор, который устанавливает переменную из признака, так что-то вроде:
trait Foo {
var foo: String
}
class Bar (foo: String) extends Foo { /* ... */ }
Где я хочу, чтобы строка foo
признака была установлена, когда я создаю объект Bar
.
Компилятор, похоже, дает мне об этом ошибки. Каков правильный способ достижения этого?
Ответы
Ответ 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, которые задаются классом.