在签名冲突的情况下,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()
}
请注意,您只能对直接混合的特征使用限定符(出现在 extends
或 with
之后的特征),因此在层次结构上爬行(例如具有基本特征Animal
) 不适用于限定符。
在方法签名冲突的情况下,如何在 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()
}
请注意,您只能对直接混合的特征使用限定符(出现在 extends
或 with
之后的特征),因此在层次结构上爬行(例如具有基本特征Animal
) 不适用于限定符。