java - Scala 选择在签名冲突的情况下实现哪个特征?

标签 java scala oop multiple-inheritance traits

在方法签名冲突的情况下,如何在 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()
}

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

关于java - Scala 选择在签名冲突的情况下实现哪个特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42783118/

相关文章:

java - headless 网络驱动程序测试。无法在java中使用xvfb

java - 卸载通过 RMI 传递的类

java - 如何使用 Spring 3.0 表达式语言参数化 @Scheduled(fixedDelay)?

java - 默认列值在 hibernate 中不起作用

java - 编写 IntelliJ Scala Plugin 插件?

scala - scala 访问限定符的保证是什么?

eclipse - 神秘的 Scala + Eclipse 编译错误

java - 接口(interface)类型的多态数组的有效成员

vb.net - OOP - 在哪里调用数据访问层?

.net - VB.NET 中的默认属性?