मैं प्राप्त करने के लिएस्कैला में गतिशील मिश्रण - क्या यह संभव है?
def dynamix[A, B](a: A): A with B
एक उचित कार्यान्वयन मैं जानता हूँ कि हो सकता है क्या बी रहा है करना चाहते हैं क्या है, लेकिन नहीं पता है कि एक है (लेकिन मैं कुछ जोड़ सकता है अगर B एक स्वयं टाइप तो है ए पर बाधाएं)। स्कैला कंपाइलर उपर्युक्त हस्ताक्षर से खुश है, लेकिन मैं अभी तक यह नहीं समझ पाया कि कार्यान्वयन कैसा दिखता है - यदि यह संभव है।
कुछ विकल्प है कि मेरे दिमाग में आया था:
- प्रतिबिंब/गतिशील प्रॉक्सी का उपयोग करना।
- सरल मामला: ए जावा स्तर पर एक इंटरफ़ेस है + मैं बी को तत्काल कर सकता हूं और इसका कोई प्रकार नहीं है। मुझे लगता है कि यह बहुत कठिन नहीं होगा (जब तक कि मैं कुछ ग़लत, अप्रत्याशित समस्याओं में भाग नहीं लेता):
एक नया बी (बी) बनाएं, और ए और बी दोनों को कार्यान्वित करने वाली प्रॉक्सी और एक या बी या तो एक आमंत्रण हैंडलर का उपयोग करके । - यदि बी को तत्काल नहीं किया जा सकता है, तो भी मैं इसका उप-वर्ग बना सकता हूं, और जैसा ऊपर वर्णित किया गया है वैसा ही करें। यदि इसका एक स्व प्रकार भी है तो मुझे शायद यहां और वहां कुछ प्रतिनिधिमंडल की आवश्यकता होगी, लेकिन यह अभी भी काम कर सकता है।
- लेकिन यदि ए एक ठोस प्रकार है और मुझे इसके लिए उचित इंटरफ़ेस नहीं मिल रहा है तो क्या होगा?
- क्या मैं और अधिक समस्याओं में भाग लेगा (उदाहरण के लिए रैखिकरण से संबंधित कुछ, या जावा इंटरऑपरेबिलिटी की मदद करने वाली विशेष संरचनाएं)?
- सरल मामला: ए जावा स्तर पर एक इंटरफ़ेस है + मैं बी को तत्काल कर सकता हूं और इसका कोई प्रकार नहीं है। मुझे लगता है कि यह बहुत कठिन नहीं होगा (जब तक कि मैं कुछ ग़लत, अप्रत्याशित समस्याओं में भाग नहीं लेता):
- मिश्रण के बजाय एक प्रकार की रैपिंग का उपयोग करना और बी [ए] को वापस करना, बी से सुलभ है।
दुर्भाग्य से इस मामले में कॉलर को यह जानने की आवश्यकता होगी कि घोंसले कैसे किया जाता है, जो मिश्रण/लपेटने में कई बार किया जाता है (डी [सी [बी [ए]]]) क्योंकि यह आवश्यक होगा आवश्यक कार्यक्षमता तक पहुंचने के लिए घोंसले का सही स्तर पाएं, इसलिए मैं इसे समाधान नहीं मानता। - एक कंपाइलर प्लगइन कार्यान्वित करना। मुझे इसके साथ शून्य अनुभव है लेकिन मेरी आंत महसूस यह है कि यह मामूली नहीं होगा। मुझे लगता है कि केविन राइट का autoproxy प्लगइन थोड़ा सा लक्ष्य है, लेकिन यह मेरी समस्या (अभी तक?) के लिए पर्याप्त नहीं होगा।
क्या आपके पास कोई अन्य विचार है जो काम कर सकता है? आप किस तरह से सिफारिश करेंगे? किस तरह की "चुनौतियों" की उम्मीद है?
या मुझे इसे भूलना चाहिए, क्योंकि मौजूदा स्कैला बाधाओं के साथ यह संभव नहीं है?
मेरी समस्या के पीछे इरादा: कहें कि मेरे पास एक व्यवसाय वर्कफ़्लो है, लेकिन यह बहुत सख्त नहीं है। कुछ चरणों में आदेश तय किया गया है, लेकिन अन्य नहीं करते हैं, लेकिन अंत में उन सभी को किया जाना चाहिए (या उनमें से कुछ को आगे की प्रक्रिया के लिए आवश्यक है)।
थोड़ा और ठोस उदाहरण: मेरे पास ए है, मैं इसमें बी और सी जोड़ सकता हूं। मुझे परवाह नहीं है कि पहले क्या किया जाता है, लेकिन अंत में मुझे सी के साथ बी के साथ ए की आवश्यकता होगी।
टिप्पणी: मुझे ग्रोवी के बारे में बहुत कुछ पता नहीं है लेकिन SO this question पर पॉप अप किया गया और मुझे लगता है कि यह और भी है या कम से कम संकल्पनात्मक, जैसा मैं चाहता हूं उतना ही कम।
एक और दृष्टिकोण (पर्याप्त से नहीं सोचा जानना चाहते हैं कि व्यवहार्य): में एक 'डायनामिक्स लपेटें [ए, बी]' (या नेस्टेड 'डायनेमिक्स [ए, डायनेमिक्स [बी, सी]] ') और क्लाइंट कोड को संज्ञानात्मक रूप से अनलोड करने के लिए प्रत्यारोपण के माध्यम से अनचाहे करें। प्रत्येक घोंसले की गहराई को परिभाषित किया जाना चाहिए (कोई मनमाना गहराई नहीं)। डाउनसाइड: आत्म-प्रकार की बाधाओं को लागू नहीं करेगा या स्वयं प्रकार के माध्यम से प्रकारों पर बातचीत की अनुमति नहीं देगा। अच्छी चाल के लिए –
+1, लेकिन मुझे यह महसूस हो रहा है कि मैं अभी भी कम से कम एक समस्या में चलाऊंगा: अंत में यह निर्दिष्ट करने के लिए कि मैं बी के साथ बी या डायनेमिक्स [ए, डायनेमिक्स [बी, सी] ] लेकिन मुझे मिश्रण आदेश की परवाह नहीं है? मैं डायनेमिक्स [ए, डायनेमिक्स [सी, बी]] के साथ भी खुश रहूंगा, और मुझे लगता है कि इस तरह की बाधा के साथ आने में बहुत आसान नहीं होगा (विशेष रूप से मिश्रित होने के कई गुण हैं)। फिर भी, मुझे आपकी टिप्पणी पसंद है, इसके लिए धन्यवाद। –
संभावित डुप्लिकेट [गतिशील रूप से एक विशेषता में मिलाकर] (http://stackoverflow.com/questions/10373318/mixing-in-a-trait- गतिशील रूप से) –