2017-03-14 3 views
0

メソッドのシグネチャが競合する場合に実装を選択するのがScalaで選択する方法は?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"); 
    } 
} 

をそして今、私は何かを再実装することなく、ごろごろ犬をしたいとします

これはScalaで達成することができますどのように
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 
    } 
} 

?その階層にクロール、

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後に現れる)直接で混ぜるだけ形質について修飾子を使用することができます。

答えて

1

あなたが修飾子でスーパーを使用することができます(例えば、基底形質がAnimalのもの)は、修飾子では機能しません。

関連する問題