मुझे पाइथन मेटाक्लास के समान कुछ लागू करने की आवश्यकता है। मेरे मामले में मेटाक्लास का उपयोग करने का लक्ष्य आमतौर पर किसी विशेष बेस क्लास के सभी उप-वर्गों की रजिस्ट्री बनाने के लिए होता है - यानी कक्षा के संदर्भ में वर्ग के स्ट्रिंग प्रस्तुति से मैपिंग होता है। पायथन में बेस क्लास पर मेटाक्लास रखना बहुत सुविधाजनक है ताकि प्रत्येक सबक्लास पर विशेष कुछ भी करने की आवश्यकता न हो। मैं स्कैला में कुछ ऐसा करने की तलाश में हूं। मेटाक्लास को अनुकरण करने का कोई तरीका है, या अन्यथा यह एक अलग तरीका है? धन्यवाद!स्कैला: पायथन में मेटाक्लास के समानता? स्केल में
उत्तर
पाइथन के मेटाक्लास के समान कुछ भी नहीं है। रजिस्ट्री जो आप के बारे में बोलते हैं कस्टम क्लास लोडर या प्रतिबिंब का उपयोग करके संभव हो सकता है।
धन्यवाद - क्या आप किसी वर्ग प्रकार से स्ट्रिंग प्रस्तुति प्राप्त करने के किसी अन्य सामान्य तरीके के बारे में सोच सकते हैं और फिर उस स्ट्रिंग से उस वर्ग की एक नई ऑब्जेक्ट को तुरंत चालू करने में सक्षम हो सकते हैं? –
@ हेनरिक देखें रैंडल का जवाब। एक बार आपके पास 'java.lang.Class' हो, तो आप उस पर' newInstance' कॉल कर सकते हैं। हालांकि, यदि आप किसी वर्ग के सभी उप-वर्गों को ढूंढना चाहते हैं, तो इसके बारे में जावा प्रश्न पूछें। –
आप वर्ग के पूरी तरह से योग्य नाम जानते हैं, तो आप इसे java.lang.Class
में हमेशा की तरह जावा प्रतिबिंब तरीकों का उपयोग कर, अर्थात् Class.forName(String fqClassName)
लोड कर सकते हैं। Class
के परिणामी उदाहरण को देखते हुए, तत्कालता केवल है यदि कोई शून्य-तर्क कन्स्ट्रक्टर है, अन्यथा आप सभी जावा प्रतिबिंब प्रकारों की गन्दा दुनिया में उलझ जाते हैं।
यदि आप एक प्रकार की "खोज" चाहते हैं जहां संकलन समय पर अज्ञात कक्षाएं हैं और जिनके नाम किसी भी तरह से प्रोग्राम के इनपुट या पैरामीटर के रूप में नहीं प्रदान किए जाते हैं, तो क्लासलोडर दृष्टिकोण शायद एकमात्र उत्तर है।
यह स्पष्ट नहीं है कि आप आखिरकार क्या चाहते हैं, लेकिन स्केल में पायथन के मेटाक्लास के बराबर नहीं है। यदि आप स्ट्रिंग से कक्षा प्राप्त करना चाहते हैं, तो आपको कक्षा.forनाम का उपयोग करना चाहिए। –