在方法签名冲突的情况下,如何在 Scala 中选择要选择实现的特征?
假设有以下 Java 接口(interface):
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()
}
请注意,您只能对直接混合的特征使用限定符(那些出现在 extends
或 with
之后的特征),因此在层次结构上爬行(例如具有基本特征 Animal
) 不适用于限定符。
关于java - Scala 选择在签名冲突的情况下实现哪个特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783118/