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

时间:2011-07-27 18:51:13

标签: 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

如果按照我希望的方式运行,那么(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"

是否可以使用特征覆盖自我类型中的方法?如果没有,则将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 个答案:

答案 0 :(得分:30)

你需要abstract override并且没有自我类型。

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

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

This article可能会引起人们的兴趣。

答案 1 :(得分:0)

或者你可以像下面那样进行重载

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的一部分 Trait与Foo混合,而不是子类型关系。