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

Вызов метода над суперкласса в самонастраиваемом признаке в scala

Я пытаюсь создать признак, который при смешивании заменит стандартное определение метода на тот, который вызывает исходный метод, а затем обрабатывает результат.

Вот что я пытаюсь сделать:

class Foo {
  def bar() : String = "Foos bar"
}

trait OtherStuff {
  self : Foo =>
  def bar() : String = self.bar() + " with OtherStuff"
}

class Quux extends Foo with OtherStuff

Если это сработало так, как я этого хотел, тогда (new Quux).bar теперь вернет Foos bar with OtherStuff. К сожалению, это не так: я получаю:

<console>:6: error: error overriding method bar in class Foo of type ()String;
 method bar in trait OtherStuff of type ()String needs `override' modifier
       class Quux extends Foo with OtherStuff

Но если я использую override при определении OtherStuff, я получаю:

<console>:7: error: method bar overrides nothing
         override def bar() : String = self.bar() + " with OtherStuff"

Можно ли переопределить метод в self-type с использованием признака? Если нет, будет изменен OtherStuff как признак extends Foo, а не тот, который имеет свой тип Foo, что-то плохое для всего кода, который существует, говоря такие вещи, как

class WhatEver extends Foo with Xyz with Pqr with OtherStuff with Abc

Я работаю в scala 2.7.7, потому что это правило сборки sbt, и мы еще не обновили наш проект sbt до версий 0.10.x. (Плагины, от которых мы зависим, еще не готовы)

4b9b3361

Ответ 1

Для этого вам нужно abstract override и для него не использовать тип self.

trait OtherStuff extends Foo {                                
  abstract override def bar() = super.bar() + " with OtherStuff"
}

Затем class Quux extends Foo with OtherStuff делает то, что вы хотите.

Эта статья может представлять интерес.

Ответ 2

или вы можете выполнить перегрузку, как показано ниже.

class Foo {
  def bar() : String = "Foos bar"}
trait OtherStuff {
  self : Foo =>
  def bar( s : String) : String = self.bar() + s}

class Quux extends Foo with OtherStuff
(new Quux).bar(" with other stuff")

Вещь, с аннотацией типа "тип", определенная в OtherStuff, является частью Foo, когда Предел смешивается с Foo, а не с подтипом.