在具有多重继承的scala中调用不同特征的不同方法

Calling different methods from different traits in scala with multiple inheritance

我们举下面的例子

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
}

这里,ArtistCowboy继承了Drawable并覆盖了方法drawpaintCowboyArtist 以相同的顺序继承 Cowboy 和 Artist。根据我所拥有的 read,scala 根据其继承的顺序和最右边特征的方法将被执行来确定要调用的方法。

但是,如果我希望从一个特征调用其中一个方法,而从另一个特征调用另一个方法,如您所见,我希望从 [=11] 执行 draw 方法怎么办? =] 特征,但我希望从 Cowboy 特征执行 paint 方法。

这可能吗?如果不是,解决方法是什么?

当然可以,只需使用:

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

P.S。您也可以在 traits 中使用 super[Trait],因此您可以在将其混合到 class:

之前创建具有正确优先级的 mixin
trait CowboyArtistMixin extends Cowboy with Artist{
    override def paint = super[Cowboy].paint
}

class CowboyArtist extends CowboyArtistMixin