Вызов метода в суперклассе в типаже с самотипированием в 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

Если бы это сработало так, как я хотел, то (новый Quux) .bar теперь возвращал бы Foos bar с 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

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

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

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

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

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

22
задан Daniel Martin 27 July 2011 в 18:51
поделиться