假设我创建了一个混合在两个特征中的类,这两个特征都实现了一个通用方法,如下所示:
abstract class Base {
var x:Int
def adder:Int
}
trait One extends Base {
def adder() = {x+=2; x}
}
trait Two extends Base {
def adder() = {x+=3; x}
}
class WhichOne(var x:Int = 10) extends Base with One with Two
println((new WhichOne()).adder())
在运行时,Scala当然抱怨,因为它不知道更喜欢哪种特性:
$ scala MixUpTraitImplems.scala
MixUpTraitImplems.scala:18: error: class WhichOne inherits conflicting members:
method adder in trait One of type ()Int and
method adder in trait Two of type ()Int
(Note: this can be resolved by declaring an override in class WhichOne.)
class WhichOne(val x:Int = 10) extends Base with One with Two
^
当然,覆盖adder()意味着我会继续实施adder
的新版本,但如果我不想要那样做呢?如果我想使用特征adder
或One
中明确包含的Two
的实现,该怎么办?
答案 0 :(得分:5)
您可以将其指定为super
:override def adder() = super[One].adder()
的修饰符。另请注意,这是编译时错误,不是运行时!
答案 1 :(得分:1)
一种方法是覆盖加法器,只需调用它的超类的加法器。在这种情况下,它将是实现加法器的最右边的特征/类(在下面的示例中,它将是bundle exec rake gitlab:shell:setup
特征的加法器。)
One