在scala中的自键型特征中调用超类的方法

Dan*_*tin 22 scala scala-2.7

我正在尝试创建一个特性,当混入时,将用一个调用原始方法的方法替换方法的默认定义,然后操纵结果.

这是我正在尝试做的事情:

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

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

class Quux extends Foo with OtherStuff
Run Code Online (Sandbox Code Playgroud)

如果按照我想要的方式工作,那么(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
Run Code Online (Sandbox Code Playgroud)

但如果我override在定义时使用OtherStuff,我得到:

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

是否可以使用特征覆盖自我类型的方法?如果没有,将改变OtherStuff为一个特征,extends Foo而不是一个具有自我类型的特性Foo对所有存在的代码做任何坏事

class WhatEver extends Foo with Xyz with Pqr with OtherStuff with Abc
Run Code Online (Sandbox Code Playgroud)

我在scala 2.7.7中工作,因为这是一个sbt构建规则,我们还没有将我们的sbt项目升级到0.10.x版本.(我们依赖的插件尚未准备好)

Did*_*ont 30

你需要abstract override而且没有自我类型.

trait OtherStuff extends Foo {                                
  abstract override def bar() = super.bar() + " with OtherStuff"
}
Run Code Online (Sandbox Code Playgroud)

然后class Quux extends Foo with OtherStuff做你想要的.

这篇文章可能会引起关注.

  • 如果OtherStuff在我的逻辑中不是Foo怎么办?没有extendig Foo,是不是还有另一个解决方案?或者我在这里滥用自我打字? (3认同)