我看到Scala中的特性与Java中的接口类似(但Java中的接口扩展了其他接口,它们不扩展类).我在SO上看到了一个关于特征使用的例子,其中特征扩展了一个类.
这样做的目的是什么?为什么traits可以扩展类?
我正在尝试创建一个特性,当混入时,将用一个调用原始方法的方法替换方法的默认定义,然后操纵结果.
这是我正在尝试做的事情:
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在定义时使用 …
看起来可以在具有如下特征的类上更改方法的实现:
trait Abstract { self: Result =>
override def userRepr = "abstract"
}
abstract class Result {
def userRepr: String = "wtv"
}
case class ValDefResult(name: String) extends Result {
override def userRepr = name
}
val a = new ValDefResult("asd") with Abstract
a.userRepr
Run Code Online (Sandbox Code Playgroud)
现场代码可在此处获取:http://www.scalakata.com/52534e2fe4b0b1a1c4daa436
但是现在我想调用前面的或超级实现的函数,如下所示:
trait Abstract { self: Result =>
override def userRepr = "abstract" + self.userRepr
}
Run Code Online (Sandbox Code Playgroud)
要么
trait Abstract { self: Result =>
override def userRepr = "abstract" + super.userRepr
}
Run Code Online (Sandbox Code Playgroud)
但是,这些替代方案都没有编译.知道如何实现这一目标吗?