Можно ли использовать шаблон стекируемой черты с одноэлементными объектами? - PullRequest
8 голосов
/ 21 сентября 2011

Я бы хотел использовать стекируемый паттерн черты с одноэлементными объектами, но я не могу найти способ сделать компилятор счастливым:

abstract class Pr {
  def pr()
}

trait PrePostPr extends Pr {
  abstract override def pr() {
    println("prepr")
    super.pr()
    println("postpr")
  }
}

object Foo extends Pr with PrePostPr {
  def pr() = println("Foo")
}

Попытка оценить это в repl приводит к следующей ошибке:

<console>:10: error: overriding method pr in trait PrePostPr of type ()Unit;
 method pr needs `override' modifier
         def pr() = println("Foo")

1 Ответ

13 голосов
/ 21 сентября 2011

Может, но вот так:

abstract class Pr {
  def pr()
}

trait PrePostPr extends Pr {
  abstract override def pr() {
    println("prepr")
    super.pr()
    println("postpr")
  }
}

class ImplPr extends Pr {
  def pr() = println("Foo")
}

object Foo extends ImplPr with PrePostPr

Реализация должна присутствовать в одном из суперклассов / супертрейтов. Черта абстрактной модификации должна следовать за классом / чертой с реализацией в списке наследования.

...