2017-03-14 2 views
0

Wie wählt man in Scala aus, welches Merkmal bei im Konflikt stehenden Methodensignaturen die Implementierung auswählen soll?Scala entscheiden, welche Eigenschaft bei widersprüchlichen Signaturen implementiert werden soll?

Angenommen, die folgenden Java-Schnittstellen:

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"); 
    } 
} 

Und jetzt nehme ich einen Schnurren Hund wollen, ohne etwas Neuimplementierung:

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 
    } 
} 

Wie kann dies in Scala erreicht werden?

Antwort

1

Sie können Super mit einem Qualifier verwenden:

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() 
} 

Beachten Sie, dass die Qualifikation nur für die Züge können Sie in direkt mischen (erscheinend nach einem extends oder with), so auf der Hierarchie kriechen (zB mit einem Basismerkmal Animal) funktioniert nicht mit Qualifiern.

Verwandte Themen