2012-03-02 11 views
7

मुझे .Net और CLR बिंदु दृश्य से उत्तर में अधिक दिलचस्पी है:क्यों एक संरचना किसी अन्य संरचना से नहीं ली जा सकती है?

क्यों कोई संरचना किसी अन्य संरचना या आधार के आधारभूत आधार नहीं हो सकती है?

उत्तर

12

स्ट्रक्क्स स्टैक में निश्चित आकार के स्लॉट (या जहां भी वे रह रहे हैं) पर कब्जा करते हैं।

इसलिए, आप structs के साथ किसी भी तरह का बहुरूपता नहीं कर पाएंगे, क्योंकि व्युत्पन्न संरचना एक अलग आकार होगी।

अन्य structs के सदस्यों को उत्तराधिकारी बनाना संभव होगा, लेकिन चूंकि आप किसी भी प्रकार के बहुलकवाद को करने में सक्षम नहीं होंगे, यह भ्रम के लायक नहीं होगा।

+4

हालांकि यह एक टेम्पलेटिंग वाक्यविन्यास को रोकता नहीं है, कि जब आप किसी संरचना से विरासत में आते हैं, तो आपको सभी विधियों, गुणों और इसके क्षेत्रों की एक प्रति मिलती है। यह असाइनमेंट संगत नहीं होगा, लेकिन इसमें वही लेआउट प्लस होगा जो आपने "वंश" में जो अतिरिक्त सामान जोड़ा है। मुझे लगता है कि तथ्य पर्याप्त है हालांकि, यह भ्रमित हो जाएगा। –

+4

दो शब्द: ऑब्जेक्ट स्लाइसिंग। http://en.wikipedia.org/wiki/Object_slicing –

+2

@ LasseV.Karlsen: बिल्कुल। अगर वह समर्थित था, तो यह सवाल "मैं क्यों नहीं लिख सकता" बेस बी = नया व्युत्पन्न() '?" – SLaks

1

.net में, यदि वर्ग A प्रकार B से विरासत और प्रकार A की एक वस्तु कोड किस प्रकार B की एक वस्तु की उम्मीद में भेजा जाता है, पारित कर दिया वस्तु एक B में परिवर्तित नहीं किया होगा, लेकिन एक A रहेगा। यह संभव है क्योंकि प्रत्येक ऑब्जेक्ट ने इसके साथ एक प्रकार वर्णनकर्ता का संदर्भ रखा है। कक्षाओं में उनके साथ संग्रहीत किसी भी प्रकार के वर्णनकर्ता नहीं होते हैं। यदि A प्रकार की संरचना को B की संरचना की अपेक्षा रखने वाले नियमित रूप से मूल्य से पारित किया जा सकता है, तो B प्रकार की संरचना बन जाएगा। ऐसे मामलों में जहां यह समझदार होगा, एक विस्तृत रूपांतरण ऑपरेटर को A से B से परिभाषित करना अधिक व्यावहारिक होगा।

कई बार के संदर्भ में A की संरचना को पास करने के लिए उपयोगी हो सकता है। रूपांतरण ऑपरेटर वहां मदद नहीं करेंगे। हालांकि, कुछ हद तक अजीब तरह से संभाला जा सकता है, संरचना प्रकार A में B के प्रकार के अलावा कुछ भी नहीं है। उस क्षेत्र को नियमित रूप से B की नियमित उम्मीद के संदर्भ में पारित किया जा सकता है; कठिनाई यह होगी कि किसी भी क्षेत्र में किसी भी क्षेत्र में आंतरिक संरचना का नाम शामिल करना होगा।

केवल स्ट्रक्चर के लिए ही नहीं बल्कि कक्षाओं के लिए भी सहायक होगा, 'एक्सटेंशन प्रकार' की अवधारणा होगी। सभी वर्ग, चाहे विरासत योग्य या नहीं, को विस्तार प्रकार के साथ बढ़ाया जा सकता है, जिसमें केवल इंस्टेंस सदस्य शामिल होंगे; किसी एक्सटेंशन प्रकार के चर या मान को बेस प्रकार की रन-टाइम ऑब्जेक्ट्स के रूप में माना जाएगा, और एक्सटेंशन प्रकारों और उनके मूल प्रकारों के बीच के सभी रूपांतरण, या समान आधार प्रकार से व्युत्पन्न एक्सटेंशन प्रकारों के बीच 'चौड़ाई' माना जाएगा और यह होगा नो-ऑप्स के रूप में संसाधित एक एक्सटेंशन प्रकार का एकमात्र प्रभाव उस प्रकार के लिए परिभाषित स्कोप सदस्यों को लाने के लिए होगा। ये विस्तार विधियों की तरह व्यवहार करेंगे, सिवाय इसके कि वे केवल एक्सटेंशन प्रकार के रूप में घोषित चर और चर पर लागू होंगे, और विस्तार प्रकार के सदस्यों को बेस क्लास सदस्यों पर प्राथमिकता होगी। कोई ऐसी चीजों के लिए कई प्रयोगों की कल्पना कर सकता है (ऐसे मामलों में जहां कोई कक्षा के कुछ उदाहरणों पर विस्तार विधियों का उपयोग करना चाहेगा, लेकिन हो सकता है कि वे सभी मामलों पर उपलब्ध न हों), लेकिन अभी तक कोई भाषा नहीं है, मुझे इस तरह के समर्थन के बारे में पता है सुविधा।

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