मेरे पास एक बेस क्लास है जो जावा लाइब्रेरी से आता है, जिसका कोड मैं संशोधित नहीं कर सकता।एक विशेषता, असंगत संकलक व्यवहार के साथ एक अमूर्त विधि को लागू करना?
class A {
def b { }
}
मैं स्काला में इस वर्ग का विस्तार करने और यह अमूर्त बनाने के लिए विधि ओवरराइड:: इस वर्ग (ए) एक खाली विधि (ख) जो बजाय सार के रूप में घोषित किया जाना चाहिए था है
abstract class AA extends A {
override def b
}
trait B {
def b { println("B") }
}
अगर मैं विशेषता बी के साथ ए.ए. का विस्तार, मैं एक त्रुटि मिलती है: अब मैं एक विशेषता में इस विधि को लागू प्रकार => यूनिट के वर्ग ए में अधिभावी विधि ख; प्रकार के लक्षण बी में विधि ख => यूनिट की जरूरत है `ओवरराइड 'संशोधक:
class C extends AA with B {}
इसके बजाय, यदि कोड इस तरह से किया गया था, सब कुछ त्रुटियों के बिना जो थोड़ा मेरे लिए विरोधाभासी लगता है संकलित किया गया है,:
abstract class AA {
def b
}
trait B {
def b { println("B") }
}
class C extends AA with B {}
मैं स्कैला 2.8.0 आरसी 3 चला रहा हूं, और पूरी तरह से भाषा (3 दिन) के लिए नया हूं। एक और अजीब और संबंधित व्यवहार है कि ओवरराइड लेबल आवश्यक जब ख सार नहीं है:
abstract class AA extends A {
def b
}
क्या यह वही समस्या है जैसे आप जावा क्लास के जावा टूस्ट्रिंग कार्यान्वयन को अपने स्वयं के 'def toString(): स्ट्रिंग' कार्यान्वयन को मिश्रित करके बदलना चाहते हैं जिसे आपने एक विशेषता में परिभाषित किया होगा? – huynhjl
नहीं, यह वही मामला नहीं है। उस स्थिति में संकलक व्यवहार पूरी समझ में आता है, क्योंकि यह संदिग्ध है कि परिभाषा का उपयोग किया जाना चाहिए: जावा टूस्ट्रिंग या मिश्रण एक। मेरे मामले में केवल एक ही उपलब्ध है, हालांकि। –