在签名冲突的情况下,Scala 选择从哪个特征来实现?

Scala choose which trait to implement from in case of conflicting signatures?

在方法签名冲突的情况下,如何在 Scala 中选择从哪个特征中选择实现?

假设有以下 Java 个接口:

interface Dog {
    default void makeSound() {
        System.out.println("Woof");
    }

    default void beHappy() {
        System.out.println("Wag tail");
    }
}

interface Cat {
    default void makeSound() {
        System.out.println("Meow");
    }

    default void beHappy() {
        System.out.println("Purrr");
    }
}

现在假设我想要一只咕噜咕噜的狗,而不需要重新实现任何东西:

public class PurringDog implements Dog, Cat {
    @Override
    public void makeSound() {
        Dog.super.makeSound();
    }

    @Override
    public void beHappy() {
        Cat.super.beHappy();
    }

    public static void main(String[] args) {
        PurringDog purringDog = new PurringDog();

        purringDog.makeSound(); //prints Woof
        purringDog.beHappy();   //prints Purrr
    }
}

如何在 Scala 中实现这一点?

您可以将 super 与限定符一起使用:

trait Dog {
  def makeSound(): Unit = println("Woof")
  def beHappy(): Unit = println("Wag tail")
}

trait Cat {
  def makeSound(): Unit = println("Meow")
  def beHappy(): Unit = println("Purrr")
}

class PurringDog extends Dog with Cat {
  override def makeSound() = super[Dog].makeSound()
  override def beHappy() = super[Cat].beHappy()
}

object Test extends App {
  val purringDog = new PurringDog
  purringDog.beHappy()
  purringDog.makeSound()
}

请注意,您只能对直接混合的特征使用限定符(出现在 extendswith 之后的特征),因此在层次结构上爬行(例如具有基本特征Animal) 不适用于限定符。