2010-04-08 10 views
9

दोनों द्वारा ओवरराइड किया गया है निम्न त्रुटि संदेश का क्या अर्थ है?किसी तीसरे सदस्य के बिना एक ठोस सदस्य को ओवरराइड नहीं कर सकता है जो

एक तिहाई सदस्य है कि (इस नियम आकस्मिक ओवरराइड को रोकने के लिए `` डिज़ाइन किया गया है '') दोनों द्वारा ओवरराइड है बिना एक ठोस सदस्य ओवरराइड नहीं कर सकते;

मैं स्टैकेबल विशेषता संशोधन करने की कोशिश कर रहा था। इस तथ्य के बाद यह थोड़ा सा है क्योंकि मेरे पास पहले से ही पदानुक्रम है और मैं बहुत सारे कोड को फिर से लिखने के बिना व्यवहार को संशोधित करने की कोशिश कर रहा हूं।

abstract class AbstractProcessor { 
    def onPush(i:Info): Unit 
} 

मैं एक जोड़े को मौजूदा लक्षण है, अलग अलग onPush व्यवहार लागू करने के लिए:

मैं एक आधार वर्ग AbstractProcessor कहा जाता है कि इस तरह तरह का एक सार पद्धति निर्धारित करता है है।

trait Pass1 { 
    def onPush(i:Info): Unit = { /* stuff */ } 
} 

trait Pass2 { 
    def onPush(i:Info): Unit = { /* stuff */ } 
} 

तो है कि मुझे new AbstractProcessor with Pass1 या new AbstractProcessor with Pass2 उपयोग करने के लिए अनुमति देता है।

अब मैं पास 1 और पास 2 में ऑनपश कॉल के पहले और बाद में कुछ प्रसंस्करण करना चाहता हूं जबकि सार प्रोसेसर और पास 1 और पास 2 में कोड परिवर्तन को कम करता हूं। मैं एक ऐसी विशेषता है जो कुछ इस तरह करता है बनाने के बारे में सोचा:

trait Custom extends AbstractProcessor { 
    abstract override def onPush(i:Info): Unit = { 
    // do stuff before 
    super.onPush(i) 
    // do stuff after 
    } 
} 

और new AbstractProcessor with Pass1 with Custom साथ इसे का उपयोग और मुझे लगता है कि त्रुटि संदेश मिला।

उत्तर

11

समस्या यह है कि AbstractProcessor.onPush और Pass1.onPush के बीच अस्पष्टता है। उत्तरार्द्ध पूर्व को ओवरराइड नहीं कर रहा है क्योंकि Pass1AbstractProcessor का विस्तार नहीं करता है।

यदि आप Pass1 और Pass2AbstractProcessor बढ़ाते हैं, तो समस्या हल हो जाती है। ,

def onPush(i:Info): Unit 

और Pass1, और Pass2AbstractProcessor में है कि विशेषता मिश्रण:

+1

जब तक मुझे आपका जवाब मिला, मुझे पता चला कि मैं ऑन पुश के लिए एक विशेषता बना सकता हूं और सबकुछ उसमें फैला हुआ है। मुझे लगता है कि मैं "तीसरे" शब्द से भ्रमित हो गया। मुझे आश्चर्य है कि "बिना किसी आधार सदस्य के जो दोनों द्वारा ओवरड्रिन किया गया है" बेहतर संकेत देगा। – huynhjl

0

एक अन्य समाधान एक विशेषता है कि बस शामिल है। कंपाइलर अब "आकस्मिक ओवरराइड" को रोकने की कोशिश नहीं करेगा।

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

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