scala - 使用多重继承从Scala中的不同特征调用不同的方法

标签 scala multiple-inheritance traits

让我们看下面的例子

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并覆盖方法 drawpaint . CowboyArtist以相同的顺序继承 Cowboy 和 Artist。从我所拥有的 read , scala 根据继承的顺序和最右边 trait 的方法将被执行来确定要调用哪个方法。

但是,如果我希望从一个特征调用其中一个方法,从另一个特征调用另一个方法,如您所见,我想要 drawArtist 执行的方法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/

相关文章:

scala - 在两个相等的抽象类型上定义的 Scala 方法

Scala模式匹配:+ +: operator

c++ - 此示例在C++中使用虚拟继承吗?

c++ - 限制 C++ 中虚拟基类的对象共享

python - 在 Python 中使用 super() 进行 DRY

rust - 当输出值不属于类型时如何实现 std::ops::Index

c++ - 组类模板特化

PHP Trait 覆盖 protected Trait 方法

Java Akka Actors - 消息限制和优先级

sql - 通过Spark组查找时间戳的最小值