Я считаю, что хотя scala в некотором смысле автоматически создает метод name_=
при объявлении переменной, он недоступен для переопределения и тому подобное, если вы не объявите его явно. Следующее, однако, должно работать:
class Topping(var _name:String) {
def name : String = _name
def name_= (s : String) { _name = s }
}
trait LoggingNameTrait extends Topping {
abstract override def name_=(aName:String) {
print(aName)
super.name_=(aName) // this line doesn't compile }
}
Это должно быть функционально эквивалентно тому, что вы пытались изначально,
val t = new Topping with LoggingNameTrait
t.name = "Name"
Распечатает «Имя» и установит внутреннее значение _name
, так что val s = t.name
назначит «Имя» на s
, как и следовало ожидать. Единственным отличием является более точное определение функций-установщиков и функций-получателей.