2016-09-01 3 views
0

Lassen Sie uns sagen, ich habe den folgenden Code, wo ich hybride Wesen erlauben und weil jemand Arten mischen kann (zB haben nur reine Menschen oder reine Aliens), würde ich gerne eine Methode haben, dass Stacking Traits und abstrakte Klassen mit Overrides

trait Person { 

    def say(): Unit 

} 

trait Human { 

    def say(): Unit = println("Hi, I am a human") 
} 

trait Dude extends Human { 

    override def say(): Unit = { 
    super.say() 
    println("Duuude!") 
    } 
} 

abstract class Alien(msg: String) extends Person { 

    def say(): Unit = println(s"Hi, I'm an alien: $msg") 
} 

class Hybrid(name: String) extends Alien("bleep") with Dude // does not work! 

val someone = new Hybrid("John") 
someone.say() 

Dies gilt nicht kompilieren, weil:

error: overriding method say in class Alien of type()Unit; 
method say in trait Dude of type()Unit cannot override a concrete member without a third member that's overridden by both (...) 

ist es möglich, haben someone.say() zeigen folgende, die say genannt wird ‚eingemischt‘, erklärt, was ist?

Hi, I'm am a human 
Duuude! 
Hi, I'm an alien: bleep 

Ich habe daran gedacht, ein Sonderklasse zu schaffen, die in beiden Zügen/Klassen mischen schon, aber wie würde ich mich dann über die jeweiligen say Methoden zugreifen, wie offensichtlich super.say mehrdeutig sein.

+3

Sie haben widersprüchlichen Methoden in Ihrer Implementierung. Was Sie erreichen wollen, ist absolut machbar, aber Sie müssen ein besseres Vererbungsmodell einführen, da dasjenige, das Sie jetzt haben, einfach nicht zusammengesetzt wird. Du könntest mit Alexeys Antwort gehen, die tun wird, was du willst, aber es löst nicht die schlechte Struktur. – sebszyller

+0

Duplikate http://Stackoverflow.com/q/17500342/1296806 –

Antwort

6
class Hybrid(name: String) extends Alien("bleep") with Dude { 
    override def say() = { 
    super[Dude].say() 
    super[Alien].say() 
    } 
} 
+0

upvoted für schnell und wirklich sehr genau – Rakshith

+1

Wow, wusste nicht, dass 'Super [etwas]' war erlaubt ... Cool! – Ian

0

Also Grundsätzlich die Klasse Hybrid weiß nicht, welche Methode muss überschrieben werden. Dies könnte durch Ändern des Methodennamens gelöst werden. U kann versuchen, dieses

trait Person { 

    def say(): String 

} 

    trait Human { 
    def sayHuman: String = ("Hi, I am a human") 
} 

trait Dude extends Human { 

override def sayHuman(): String = { 
super.sayHuman +"Duuude!" 
} 
} 

abstract class Alien(msg: String) extends Person { 

    def say(): String= "Hi, I'm an alien:"+msg 
} 


class Hybrid(name: String) extends Alien("bleep") with Dude{ 
override def toString:String= super.say+"\n"+super.sayHuman 
}