2012-05-08 26 views
7

वीएस कंपाइलर WINMD प्रकार लाइब्रेरी के लिए सीलबंद खुला प्रकार बनाने की अनुमति नहीं देता है।WinMD/WinRT घटकों के लिए क्यों खुला प्रकारों को सील कर दिया जाना चाहिए?

यह प्रतिबंध क्यों रखा गया है? (मुझे मुहरबंद प्रकार के फायदे के बारे में पता है, मेरा सवाल विन आरटी घटकों के संबंध में है)।

+4

आपका शीर्षक इस प्रश्न से असहमत प्रतीत होता है? ("मुहरबंद होना चाहिए" बनाम "मुहरबंद की अनुमति नहीं देता है") –

उत्तर

4

यह एक वास्तुशिल्प सीमा है, जिसे COM द्वारा लगाया गया है। जो किसी भी WinRT प्रकार के मूल में बैठता है, वे I अज्ञात और द्वितीय अक्षय से व्युत्पन्न होते हैं। COM के साथ समस्या यह है कि यह केवल इंटरफ़ेस विरासत का समर्थन करता है लेकिन कार्यान्वयन विरासत नहीं। जो एक मजबूत COM डिजाइन लक्ष्य था, कार्यान्वयन विरासत कुख्यात हीरा समस्या सहित कार्यान्वयन विवरण से बहुत भरा हुआ है।

प्रतिनिधिमंडल द्वारा विरासत कार्य करने का एक तरीका है, व्युत्पन्न वर्ग में प्रत्येक विधि स्पष्ट रूप से संबंधित आधार इंटरफ़ेस विधि को कॉल करती है, लेकिन यह स्वयं को करने में बहुत दर्दनाक है। लेकिन अन्यथा जिस तरह से Windows.UI.Xaml वर्ग विरासत लागू करते हैं।

+0

जो सवाल का उत्तर देता है। हीरा समस्या का उल्लेख करने के लिए विशेष धन्यवाद – Tilak

+1

यह बिल्कुल सटीक नहीं है, असीमित Winrt कक्षाओं को लागू करना संभव है, लेकिन उन्हें जावास्क्रिप्ट से उपभोग नहीं किया जा सकता है और उन्हें निम्न स्तर (आईडीएल) संलेखन अनुभव का उपयोग करने की आवश्यकता है, जो दृश्य स्टूडियो से काफी चुनौतीपूर्ण हो सकता है। इसके अलावा सभी व्युत्पन्न कक्षाएं (मुहरबंद या अदृश्य) अंततः विंडोज नेमस्पेस में कक्षाओं से प्राप्त होनी चाहिए। –

+0

क्या आप किसी भी सहायक दस्तावेज को इंगित कर सकते हैं। मैं देखना चाहता हूं, यह कैसे किया जा सकता है। मेरे मामले में, मुझे यह सब वीएस के भीतर चाहिए, लेकिन यह जानना उचित होगा कि पृष्ठभूमि में चीजें कैसे चल रही हैं – Tilak

1

मेरा मानना ​​है कि कारण यह है कि उजागर प्रकार सभी अलग-अलग प्रकार की भाषाओं (सी #, सी ++, जावास्क्रिप्ट भविष्य में किसी और से अधिक) से उपयोग योग्य होना चाहिए।

तो यदि आपके पास कक्षा है, तो कक्षा के उपयोग में से एक इसे नई कक्षा में ओवरराइड कर रहा है। मैं वर्ग को ओवरराइड करना चाहता हूं, जो अलग-अलग भाषा में किया जाता है। लेकिन यह एक समस्या है। सी ++ में किए गए उत्तराधिकारी वर्ग द्वारा, सी # में किए गए बेस क्लास को ओवरराइड करना चाहते हैं? यह कभी काम नहीं कर सकता है, क्योंकि उनमें से दोनों पूरी तरह से अलग और असंगत ओओपी कार्यान्वयन हैं।

खुला कक्षाओं को सील करने के लिए मजबूर कर, आप इस समस्या को हटा दें और सुनिश्चित करें कि लोग ऐसा कुछ करने की कोशिश नहीं करेंगे।

मुझे यकीन है कि इससे कहीं अधिक मौलिक चीजें हैं, लेकिन यह मेरे दिमाग में पहले आया था।