gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:42:59 24 4
gpt4 key购买 nike

让我们看下面的例子

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com