让我们看下面的例子
trait Drawable {
def draw
def paint
}
trait Cowboy extends Drawable {
override def draw() { println("Bang!") }
override def paint(){ println("I need this to be painted")}
}
trait Artist extends Drawable {
override def draw() { println("A pretty painting") }
override def paint(){ println("I don't want this to be painted")}
}
class CowboyArtist extends Cowboy with Artist
object Main extends App {
(new CowboyArtist()).draw() // A pretty painting
(new CowboyArtist()).paint() // I don't want this to be painted
}
在这里,
Artist
和 Cowboy
继承Drawable
并覆盖方法 draw
和 paint
. CowboyArtist
以相同的顺序继承 Cowboy 和 Artist。从我所拥有的 read , scala 根据继承的顺序和最右边 trait 的方法将被执行来确定要调用哪个方法。但是,如果我希望从一个特征调用其中一个方法,从另一个特征调用另一个方法,如您所见,我想要
draw
从 Artist
执行的方法trait 但我想要 paint
要从 Cowboy
执行的方法特征。这可能吗?如果不是,解决方法是什么?
最佳答案
当然,只需使用:
class CowboyArtist extends Cowboy with Artist {
override def paint = super[Cowboy].paint
}
super[Trait]
允许您从要调用的线性化中选择确切的特征。所以现在:
scala> (new CowboyArtist()).paint()
I need this to be painted
scala> (new CowboyArtist()).draw()
A pretty painting
附注您可以使用
super[Trait]
内部特征也是如此,因此您可以在将其混合到类中之前创建具有正确优先级的混合:trait CowboyArtistMixin extends Cowboy with Artist{
override def paint = super[Cowboy].paint
}
class CowboyArtist extends CowboyArtistMixin
关于scala - 使用多重继承从Scala中的不同特征调用不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32578804/