选择特征以从 Scala 中继承通用方法
Selecting trait to inherit common method from in Scala
假设我创建了一个 class 混合了两个特征,这两个特征都实现了一个通用方法,例如:
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
的新版本,但如果我不想要那个怎么办?如果我想使用显式包含在特征 One
或 Two
中的 adder
的实现怎么办?
您可以将此指定为 super
的修饰符:override def adder() = super[One].adder()
。另请注意,这是一个编译时错误,不是运行时!
一种方法是覆盖加法器以仅调用它的超级加法器 class。在这种情况下,最右边的 trait/class 将实现加法器(在下面的示例中,它将是 One
特征的加法器)。
class WhichOne(var x:Int = 10) extends Base with Two with One {
override def adder() = super.adder()
}
假设我创建了一个 class 混合了两个特征,这两个特征都实现了一个通用方法,例如:
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
的新版本,但如果我不想要那个怎么办?如果我想使用显式包含在特征 One
或 Two
中的 adder
的实现怎么办?
您可以将此指定为 super
的修饰符:override def adder() = super[One].adder()
。另请注意,这是一个编译时错误,不是运行时!
一种方法是覆盖加法器以仅调用它的超级加法器 class。在这种情况下,最右边的 trait/class 将实现加法器(在下面的示例中,它将是 One
特征的加法器)。
class WhichOne(var x:Int = 10) extends Base with Two with One {
override def adder() = super.adder()
}