Переопределение метода неявного сеттера с чертой в Scala - PullRequest
3 голосов
/ 27 ноября 2011

Я пытаюсь реализовать стековый шаблон черт в Scala (аналогично http://www.artima.com/scalazine/articles/stackable_trait_pattern.html). Вот моя попытка. Я начинаю определять простой класс:

class Topping(var name:String)

Это объявление класса должно автоматически создавать метод получения и установки для переменной с именем "name". Итак, я создаю черту, расширяющую этот класс:

trait LoggingNameTrait extends Topping {

  override def name_=(aName:String) {
    print(aName)
    super.name_=(aName) // this line doesn't compile
  }

}

Если приведенный выше код сработал, он должен переопределить неявный установщик для поля «имя», распечатать его на консоли и затем вызвать установщик класса, который использует эту черту. Я получаю «super не может быть использован для имени переменной».

Знаете ли вы, почему компилятор Scala не позволяет мне переопределить неявный установщик?

Ответы [ 3 ]

7 голосов
/ 27 ноября 2011

Это ограничение реализации: super работает только для def с.

https://issues.scala -lang.org / browse / SI-1938

2 голосов
/ 27 ноября 2011

Сеттер не называется name_, он называется name_= (обратите внимание на знак равенства).

1 голос
/ 27 ноября 2011

Я считаю, что хотя 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, как и следовало ожидать. Единственным отличием является более точное определение функций-установщиков и функций-получателей.

...