2011-05-06 5 views
6

मैं बनाने के लिए क्या मैं डेल्फी 2007 में एक कक्षा फैक्टरी मैं एक समारोह में एक व्युत्पन्न वर्ग प्रकार पारित करने के लिए चाहते हैं और यह उस वर्ग प्रकार का ऑब्जेक्ट का निर्माण किया है होना करने के लिए समझ में कोशिश कर रहा हूँ।मेटाक्लास क्लास फैक्ट्री के माध्यम से तत्काल होने पर व्युत्पन्न कन्स्ट्रक्टर को क्यों नहीं कहा जाता है?

मैं ऐसे How can I create an Delphi object from a class reference and ensure constructor execution? के रूप में कुछ अच्छे संदर्भ, मिल गया है, लेकिन मैं अभी भी यह काफी सही काम करने के लिए नहीं मिल सकता है। नीचे दिए गए परीक्षण में, मैं इसे व्युत्पन्न कन्स्ट्रक्टर को कॉल करने के लिए नहीं मिल सकता, भले ही डीबगर मुझे बताता है कि ओक्लास टीसीडीडिव है।

मुझे लगता है कि मैं यहां कुछ मौलिक के बारे में उलझन में हूं और कुछ स्पष्टीकरण का उपयोग कर सकता हूं। धन्यवाद।

program ClassFactoryTest; 
{$APPTYPE CONSOLE} 
uses 
    SysUtils; 

// BASE CLASS 
type 
    TMyBase = class(TObject) 
    bBaseFlag : boolean; 
    constructor Create; virtual; 
    end; 
    TMyBaseClass = class of TMyBase; 

constructor TMyBase.Create; 
begin 
    bBaseFlag := false; 
end; 

// DERIVED CLASS 
type 
    TMyDerived = class(TMyBase) 
    bDerivedFlag : boolean; 
    constructor Create; 
    end; 

constructor TMyDerived.Create; 
begin 
    inherited; 
    bDerivedFlag := false; 
end; 

var 
    oClass: TMyBaseClass; 
    oBaseInstance, oDerivedInstance: TMyBase; 
begin 
    oClass := TMyBase; 
    oBaseInstance := oClass.Create; 

    oClass := TMyDerived; 
    oDerivedInstance := oClass.Create; // <-- Still calling Base Class constructor 
end. 

उत्तर

13

आप व्युत्पन्न वर्ग निर्माता पर override निर्दिष्ट करने के लिए उपेक्षित। (मुझे बेस-क्लास विधि को छिपाने के बारे में संकलक से चेतावनी की उम्मीद होगी।) इसे जोड़ें, और आपको TMyDerived.Create कहा जाना चाहिए।

TMyDerived = class(TMyBase) 
    bDerivedFlag : boolean; 
    constructor Create; override; 
end; 

एक वैकल्पिक रहेगी, क्योंकि आपके कंस्ट्रक्टर्स कोई पैरामीटर नहीं, आभासी कंस्ट्रक्टर्स छोड़ करने और बस AfterConstruction ओवरराइड है।

+2

+1, लेकिन ... 'आभासी कंस्ट्रक्टर्स छोड़ करने और बस AfterConstruction.' Urgh कैसे बहुत भ्रमित करने वाले गैर मानक ओवरराइड है। कृपया रचनाकारों के साथ चिपके रहें – Johan

+1

इसके लिए 'AfterConstruction' का उपयोग करने में एकमात्र समस्या यह है कि यह इरादा स्पष्ट नहीं करता है। उप-वर्गीकृत कन्स्ट्रक्टर को उपclass करना और जोड़ना आसान होगा। एक आभासी कन्स्ट्रक्टर यह स्पष्ट करता है। उस ने कहा, अगर आपने यह गलती की है, तो आपका कोड काम नहीं करेगा जो मुझे हमेशा एक उत्कृष्ट सुरक्षा नेट माना जाता है! –

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

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