2009-09-17 9 views
6

मैं वर्चुअल कंस्ट्रक्टर के बारे में पढ़ता हूं, कुछ डिज़ाइन पैटर्न को लागू करने के लिए उपयोग किया जाता है, लेकिन वर्चुअल कंस्ट्रक्टर की किसी भी आवश्यकता को समझ में नहीं आया। तो आभासी रचनाकार क्या हैं और हमें वास्तव में उनकी आवश्यकता क्यों है?जहां आभासी रचनाकारों का उपयोग किया जाता है?

उत्तर

12

अधिकांश प्रोग्रामिंग भाषाओं में, afaik, आप वर्चुअल कन्स्ट्रक्टर नहीं ढूंढ सकते हैं। किसी वस्तु के निर्माण के बाद रनटाइम पर वर्चुअल सदस्यों का ओवरराइड मूल्यांकन किया जाता है, लेकिन अधिकांश भाषाओं में आपको उदाहरण बनाने के दौरान वास्तविक कक्षा को जानने की आवश्यकता होती है। इसलिए आभासी रचनाकार इन भाषाओं में कोई समझ नहीं लेते हैं।

नेट में, आप प्रतिबिंब के माध्यम से एक ऐसी ही समाधान प्राप्त कर सकते हैं, यानी आप प्रकार वर्ग है कि वस्तु आप का निर्माण करना चाहते हैं का प्रतिनिधित्व करता है का एक उदाहरण के माध्यम से एक वस्तु का निर्माण कर सकते हैं। और सामान्य समर्थन के साथ, आप कुछ समान प्राप्त कर सकते हैं, लेकिन यह वर्चुअल कन्स्ट्रक्टर नहीं है।

एकमात्र प्रोग्रामिंग भाषा जिसके साथ मैंने काम किया है, उसके पास वास्तविक वर्चुअल कन्स्ट्रक्टर डेल्फी है। डेल्फी में, एक विशिष्ट "मेटाक्लास प्रकार" होता है, यानी एक विशिष्ट प्रोग्रामिंग निर्माण जो मेटाक्लास का प्रतिनिधित्व करता है (जबकि .NET, मेटा क्लास, Type कक्षा में, केवल सामान्य वर्ग का एक उदाहरण है)। तो अगर आप एक वर्ग TMyClass कहा जाता है - Deplhi नामकरण रिवाजों का;)

TMyClass : Class ... 

आप अब इस

TMyMetaClass : class of TMyClass 

तरह metaclass घोषणा कर सकते हैं, आप एक चर TMyMetaClass प्रकार की है कि घोषणा कर सकते हैं

MyMetaClassVariable : TMyMetaClass 
... 
// Assign the meta class to refer to our concrete class 
MyMetaClassVariable := TMyClass; 

और आप इस चर

के माध्यम से एक नया उदाहरण बना सकते हैं
MyClassInstance := MyMetaClassVariable.Create(); 

अब, MyMetaClassVariable किसी भी वर्ग को संदर्भित कर सकता है जो TMyClass या इसके विशेषज्ञता है। यदि निर्माता को आभासी घोषित किया जाता है, तो चर का निर्माण उस विशिष्ट वर्ग के उदाहरण के साथ किया जाएगा।

उसी तरह, आप डेल्फी में आभासी स्थिर तरीकों ऐलान करते हैं और metaclass का एक उदाहरण के माध्यम से उन्हें फोन कर सकते हैं।

तो दूसरा प्रश्न? हमें आपकी प्रतिक्रिया का बेसब्री से इंतेज़ार हैं। खैर, डेल्फी में, वे .NET में Type कक्षा जैसी कुछ समस्याओं को हल करते हैं, जिससे आप उन वस्तुओं को बनाने की अनुमति देते हैं जहां आप डिज़ाइन समय पर कक्षा का नाम नहीं जानते हैं। उदाहरण के लिए, जब आप एक फॉर्म डिज़ाइन करते हैं और आप नियंत्रणों का एक समूह डालते हैं, तो इस डेटा को डिजाइनर द्वारा क्रमबद्ध किया जाना चाहिए, और deserialized। जब फॉर्म deserialized है, तो यह वास्तव में metatypes पढ़ा जाता है, और सही उदाहरण (यह TextBox, ComboBox, आदि) मेटाटाइप पर आभासी कन्स्ट्रक्टर को कॉल करके बनाया गया है।

+0

डेल्फी वाक्यविन्यास सही है। –

+0

@Gamecat - धन्यवाद, मैंने अपना "अस्वीकरण" हटा दिया;) इसके लिए शोर के रूप में कोई आवश्यकता नहीं है। – Pete

+0

दरअसल, यह 'TMyClass = class' है, यानी' = 'और' '' 'नहीं। –

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