Я пытаюсь создать признак, который при смешивании заменит определение метода по умолчанию на то, которое вызывает исходный метод, а затем манипулирует результатом.
Вот что я пытаюсьделать:
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"
IsЕсть ли возможность переопределить метод в самостоятельном типе с использованием черты?Если нет, то изменится 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.(Плагины, от которых мы зависим, еще не готовы)