अलेक्जेंडर का समाधान एक अच्छा है लेकिन कुछ स्थितियों में पर्याप्त नहीं है। मान लीजिए कि आप एक TClassFactory क्लास स्थापित करना चाहते हैं जहां TClass संदर्भ रनटाइम के दौरान संग्रहीत किए जा सकते हैं और बाद में पुनर्प्राप्त उदाहरणों की मनमानी संख्या।
इस तरह के एक वर्ग कारखाने को कक्षाओं के वास्तविक प्रकारों के बारे में कभी भी कुछ नहीं पता होगा और इस प्रकार उन्हें मेटा वर्गों के अनुसार नहीं डाला जा सकता है। ऐसे मामलों में सही रचनाकारों का आह्वान करने के लिए, निम्नलिखित दृष्टिकोण काम करेगा।
सबसे पहले, हमें एक साधारण डेमो वर्ग की आवश्यकता है (सार्वजनिक क्षेत्रों को ध्यान में रखें, यह सिर्फ प्रदर्शन उद्देश्यों के लिए है)।
interface
uses
RTTI;
type
THuman = class(TObject)
public
Name: string;
Age: Integer;
constructor Create(); virtual;
end;
implementation
constructor THuman.Create();
begin
Name:= 'John Doe';
Age:= -1;
end;
अब हम पूरी तरह से आरटीटीआई द्वारा और सही कन्स्ट्रक्टर कॉल के साथ थुमान प्रकार की वस्तु को तुरंत चालू करते हैं।
procedure CreateInstance();
var
someclass: TClass;
c: TRttiContext;
t: TRttiType;
v: TValue;
human1, human2, human3: THuman;
begin
someclass:= THuman;
// Invoke RTTI
c:= TRttiContext.Create;
t:= c.GetType(someclass);
// Variant 1a - instantiates a THuman object but calls constructor of TObject
human1:= t.AsInstance.MetaclassType.Create;
// Variant 1b - same result as 1a
human2:= THuman(someclass.Create);
// Variant 2 - works fine
v:= t.GetMethod('Create').Invoke(t.AsInstance.MetaclassType,[]);
human3:= THuman(v.AsObject);
// free RttiContext record (see text below) and the rest
c.Free;
human1.Destroy;
human2.Destroy;
human3.Destroy;
end;
आप पाएंगे कि वस्तुओं "human1" और "human2", शून्य करने के लिए प्रारंभ किया गया है जैसे कि, नाम = '' और उम्र = 0, जो नहीं है कि हम क्या चाहते हैं। वस्तु मानव 3 के बजाय थूमान के निर्माता में प्रदान किए गए डिफ़ॉल्ट मान रखती है।
नोट, हालांकि, इस विधि के लिए आपके वर्गों को पैरामीटर के साथ कन्स्ट्रक्टर विधियों की आवश्यकता होती है। उपरोक्त सभी को मेरे द्वारा कल्पना नहीं की गई थी, लेकिन Rob Love's Tech Corner में शानदार ढंग से और अधिक विस्तार से (उदाहरण के लिए, सी। फ्री भाग) समझाया गया था।
ठीक है, अगर मैं सही ढंग से समझता हूं तो इसका मतलब है कि अगर मैं डेल्फी के साथ एक सामान्य ऑब्जेक्ट फैक्ट्री बनाना चाहता हूं, तो मुझे एक चर के लिए "टीएम क्लास की कक्षा" असाइन करना होगा - लेकिन ऐसा संभव नहीं है। – mjn
यदि आप किसी प्रकार के ऑब्जेक्ट को बनाना चाहते हैं, तो आपको कक्षा प्रकार की जानकारी रखने की आवश्यकता है। यदि आपके पास कोई कक्षा की जानकारी नहीं है - तो आप इस प्रकार की वस्तु का निर्माण नहीं कर सकते हैं। काफी स्पष्ट;) – Alex