Вызов метода для суперкласса в самотипизированной черте в 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, используя черту? Если нет, будет изменение 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. (Плагины, от которых мы зависим, еще не готовы)
2 ответа
Тебе нужно abstract override
и нет самопечатания для этого.
trait OtherStuff extends Foo {
abstract override def bar() = super.bar() + " with OtherStuff"
}
затем class Quux extends Foo with OtherStuff
делает то, что вы хотите.
Эта статья может представлять интерес.
Или вы можете сделать перегрузку, как показано ниже
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")
Дело в том, что с аннотацией self type "другие вещи", определенные в OtherStuff, являются частью Foo, когда Trait смешивается с Foo, а не с отношением подтипа.