2016-09-13 12 views
11

मुझे संदेह है कि मैं हल नहीं कर सकता। मैंने class constructors के लिए embarcadero पर प्रलेखन पढ़ा है लेकिन मैं इसका अर्थ समझ नहीं पा रहा हूं। दूसरे शब्दों में, constructor और class constructor के बीच उपयोग अंतर क्या है? मैं इस किया था:डेल्फी कन्स्ट्रक्टर और क्लास कन्स्ट्रक्टर

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

इसके बजाय इस कोड को ठीक से काम नहीं कर रहा है:

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    class constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

class constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

मुझे लगता है कि इस सवाल का जवाब दस्तावेज की इस पंक्ति में है:

आम तौर पर, वर्ग निर्माता ये हैं क्लास के स्थिर फ़ील्ड को प्रारंभ करने या प्रारंभिक प्रकार का प्रदर्शन करने के लिए उपयोग किया जाता है, जिसे क्लास या किसी भी क्लास इंस्टेंस के ठीक से काम करने से पहले आवश्यक है।

मुझे बताओ अगर मैं सही हूँ:

  • निर्माता: मैं, inherited Create; उपयोग कर सकते हैं चर और इतने पर आरंभ कर देगा।
  • कक्षा निर्माता: जब मैं अपनी कक्षा में तुरंत ऑब्जेक्ट बनाना चाहता हूं तो मैं इसका उपयोग कर सकता हूं?

उदाहरण के लिए पर नीचे देखो:

type 
    TBox = class 
    private 
    class var FList: TList<Integer>; 
    class constructor Create; 
    end; 

implementation 

class constructor TBox.Create; 
begin 
    { Initialize the static FList member } 
    FList := TList<Integer>.Create(); 
end; 

end. 

यहाँ मैं वस्तु तुरंत बनाने के लिए जब मैं मुख्य रूप में TBox.Create फोन जा रहा हूँ?

+3

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

+0

तो मैं उस से बच सकता हूं और केवल क्लासिक कन्स्ट्रक्टर की देखभाल कर सकता हूं? –

+0

यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं। एक वर्ग var उस प्रकार के लिए वैश्विक चर का एक प्रकार है और कुछ मामलों में उपयोगी हो सकता है। –

उत्तर

17
  • एक वर्ग निर्माता बिल्कुल एक बार निष्पादित करता है, जब इकाई जिसे घोषित किया जाता है उसे प्रारंभ किया जाता है। एक वर्ग कन्स्ट्रक्टर एक स्थिर वर्ग विधि है, और इसलिए Self परिभाषित नहीं किया गया है।
  • एक कन्स्ट्रक्टर निष्पादित करता है जब स्पष्ट रूप से बुलाया जाता है और कक्षा के उदाहरण को शुरू करने का काम होता है।

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

यदि भविष्य में आपको कक्षा के स्वामित्व वाले चर (जैसे किसी उदाहरण के स्वामित्व के विपरीत) शुरू करने की आवश्यकता है तो आप खुद को कक्षा कन्स्ट्रक्टर का उपयोग करना चाहते हैं। उस समय तक, उन्हें अनदेखा करने के लिए स्वतंत्र महसूस करें।

+3

ध्यान दें कि कक्षा का उपयोग होने पर केवल 'वर्ग कन्स्ट्रक्टर' ** ** निष्पादित होता है। तो एक इकाई के सामान्य 'प्रारंभिकरण' खंड के विपरीत (जो हमेशा निष्पादित होता है), यह केवल तभी निष्पादित होता है जब वर्ग * कहीं * उपयोग किया जाता है। एक 'वर्ग विनाशक' के लिए भी यही सच है। –

+0

एक प्रारंभिक खंड निष्पादित करता है यदि इकाई का संदर्भ दिया गया हो। इसी तरह एक वर्ग निर्माता। केवल कक्षा को संदर्भित किया जाता है या नहीं। –

+0

केवल तभी कक्षा ** ** उपयोग की जाती है। आप कक्षा के एक चर घोषित कर सकते हैं और फिर भी यह नहीं चलेगा। इकाई शामिल होने के बाद, इनिट सेक्शन हमेशा चलते हैं। –

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