2013-10-03 10 views
16

पर विचार करें नीचे दिए गए कोड:स्केल एकाधिक विरासत में, समान हस्ताक्षर के साथ विरोधाभासी विधियों को कैसे हल करें लेकिन अलग-अलग रिटर्न प्रकार?

trait A { 
    def work = { "x" } 
} 

trait B { 
    def work = { 1 } 
} 

class C extends A with B { 
    override def work = super[A].work 
} 

कक्षा C की वजह से स्केला 2.10 में संकलन नहीं होगा, "type => स्ट्रिंग की विशेषता एक में अधिभावी विधि काम; विधि काम असंगत प्रकार है"।

एक विशिष्ट विधि कैसे चुनें?

उत्तर

15

मुझे डर है कि ऐसा करने का कोई तरीका नहीं है। super[A].work तरीका केवल तभी काम करता है जब A और B समान रिटर्न प्रकार हों।

class D extends B 

.... 

val test: List[B] = List(new C(), new D()) 
test.map(b => b.work) //oops - C returns a String, D returns an Int 
5

स्कैला आपको A और B मिश्रण करने से रोकता है यदि वे एक ही नाम और असंगत हस्ताक्षर के साथ एक विधि घोषित करते हैं।

6

आप ऐसा नहीं कर सकते:

इस पर विचार करें। कोड के इस टुकड़े पर

देखो:

val s: String = a.work 
val i: Int = b.work 

यदि हम अनुमति इस तरह के कोड को संकलित करने के लिए, निम्न में से एक:

val c = new C 
val a: A = c 
val b: B = c 

कोई रास्ता नहीं है कि दोनों इन पंक्तियों के काम कर सकता है असाइनमेंट को ClassCastException फेंकना होगा या किसी अन्य तरीके से विफल होना होगा। इसलिए, इस तरह के संघर्ष को हल करना संभव नहीं है।

class C extends A { 
    def toB = new B { 
    //implement B methods by somehow delegating them to C instance 
    } 
} 
5

आप स्काला में क्या है कि नहीं कर सकते हैं:

मैं तुम्हें प्रतिनिधिमंडल के कुछ फार्म, हो सकता है कुछ इस तरह के साथ इस समाधान करने के लिए है लगता है।

तरह से इससे बचने के लिए सहयोगियों के रूप में लक्षण का उपयोग है

trait A { 
    def work = { "x" } 
} 

trait B { 
    def work = { 1 } 
} 

class C { 
    val a = new A { } 
    val b = new B { } 

    a.work 
    b.work 
} 
संबंधित मुद्दे