代码之家  ›  专栏  ›  技术社区  ›  Rahul aliassiri

使用多重继承从scala的不同特性调用不同的方法

  •  4
  • Rahul aliassiri  · 技术社区  · 9 年前

    让我们以下面的示例为例

    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 以相同的顺序继承牛仔和艺术家。从我所拥有的 read ,scala根据其继承的顺序和最右侧特征中的方法的执行顺序来确定要调用哪个方法。

    但是,如果我希望从一个特性调用一个方法,而另一个特性则调用另一个方法(如您所见的示例),我希望 要从中执行的方法 艺术家 但我想要 油漆 要从 牛仔 特质

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

    1 回复  |  直到 9 年前
        1
  •  8
  •   dk14    9 年前

    当然,只需使用:

    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.您可以使用 超级[特性] 内部特征,因此您可以在将其混合到类中之前创建具有正确优先级的混合:

    trait CowboyArtistMixin extends Cowboy with Artist{
        override def paint = super[Cowboy].paint
    }
    
    class CowboyArtist extends CowboyArtistMixin