在具有多重继承的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
}
这里,Artist
和Cowboy
继承了Drawable
并覆盖了方法draw
和paint
。 CowboyArtist
以相同的顺序继承 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
我们举下面的例子
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 根据其继承的顺序和最右边特征的方法将被执行来确定要调用的方法。
但是,如果我希望从一个特征调用其中一个方法,而从另一个特征调用另一个方法,如您所见,我希望从 [=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:
trait CowboyArtistMixin extends Cowboy with Artist{
override def paint = super[Cowboy].paint
}
class CowboyArtist extends CowboyArtistMixin