2012-01-07 10 views
8

निम्नलिखित कोड को देखते हुए:क्यों पहले से लागू अमूर्त प्रकार ओवरराइड करना संभव नहीं है?

class A { 

    class B 

    type C <: B 

    trait D 

} 

class E extends A { 

    type C = B 

} 

class F extends E { 

    override type C = B with D 

} 

क्यों ग्रहण इंडिगो आईडीई के भीतर स्काला आईडीई की प्रस्तुति संकलक त्रुटि संदेश वर्ग ई, जो F.this.B के बराबर होती है में अधिभावी प्रकार सी के साथ शिकायत करता है; प्रकार सी में असंगत प्रकार है?

सभी वर्ग "बी" के बाद विशेषता "डी" के साथ केवल "संशोधित" है और इस प्रकार दो प्रकार की परिभाषाएं समान आधार प्रकार हैं, जो "बी" है। इसलिए संगत प्रकार परिभाषाएं।

से नीचे का कोड काम करता है। मैं परिवर्तनीय असाइनमेंट के समान प्रकार के असाइनमेंट के नियमों पर विचार करता हूं, जैसे:

class Foo 

trait Bar 

val a: Foo = new Foo 

val fooWithBar: Foo = new Foo with Bar 

क्या मेरी समझ गलत है?

+1

बार के साथ फू फू का एक उप प्रकार है। यह समस्या नहीं है। किसी प्रकार के सदस्य को फिर से परिभाषित करने की अनुमति नहीं है, जबकि इसे ठीक किया गया है, यहां तक ​​कि एक उप प्रकार के लिए भी। यदि आपके पास कक्षा बार फू फैलाता है, तो आप फू टू बार से किसी प्रकार के सदस्य को फिर से परिभाषित नहीं कर सके। –

उत्तर

13

वे संगत नहीं हैं, टाइप सी एक contravariant स्थिति में इस्तेमाल किया जा सकता

class E extends A { 
    type C = B 
    def f(c: C) 
} 


class F extends E { 
    override type C = B with D 
    def f(c: ???) 
} 

पूरक दिया e: E, आप e.f(new B) कॉल करने के लिए अनुमति दी जाती है। क्या होगा यदि eval e = new F था?

+0

जब तक ओवरराइड प्रकार "सी" को और प्रतिबंधित नहीं किया जाता है और इसके मूल प्रकार "बी" को तब तक रखा जाता है जब तक यह नक्षत्र क्यों न हो। यदि विधि "एफ" स्वीकार करता है "बी" एस को फिर से उपखंडों को क्यों स्वीकार नहीं करना चाहिए, "बी के साथ डी" के पुनर्वितरण के अनुसार? –

+3

यदि विधि बी स्वीकार करती है, तो निश्चित रूप से इसे उपप्रकार स्वीकार करना होगा। समस्या यह है कि एफ के उदाहरणों को बी के साथ बी की आवश्यकता होगी, और इसलिए सरल बी स्वीकार नहीं किया जाएगा। ई के उप प्रकार को बी में स्वीकार करना होगा। यह निश्चित रूप से उपप्रकार स्वीकार करेगा। इसे उप प्रकार के तर्क की आवश्यकता नहीं हो सकती है। –

+0

मुझे यकीन नहीं है कि यह सही काउंटर उदाहरण है। यहां बताया गया है: (क्षमा करें, उपेक्षा, मैं अपने फोन पर रद्द करने की कोशिश कर रहा था, लेकिन इसके बजाय इसे पोस्ट किया गया ..) –

संबंधित मुद्दे

 संबंधित मुद्दे