2016-11-08 6 views
15

मैं Tdictionary से प्राप्त करने की कोशिश करता हूं और किसी भी तरह से डिफ़ॉल्ट तुलनाकर्ता खो जाता है।डेल्फी Tdictionary विरासत

type 
    TinpVar = class 
    end; 
    TinputVars = class(Tdictionary<string,TinpVar>) 
    end; 
    TLVRvars = class(TinputVars) 
    constructor create; 
    end; 

constructor TLVRvars.create; 
begin 
    inherited; 
end; 

var LVRvars : TLVRvars; 

begin 
    LVRvars:=TLVRvars.create; 

इस निर्माण जब LVRvars करने के लिए एक मुख्य/मान जोड़े जोड़ने मैं एक ए वी पाने के साथ: यह है कि मैं क्या सार में क्या है। आखिरकार मैंने पाया कि इस

constructor TLVRvars.create; 
begin 
    inherited create; 
end; 

को विरासत में मिला वर्ग के निर्माता को बदलने से रोका जा सकता मुझे समझ नहीं आता क्यों मुझे लगता है कि क्या करना है। हालांकि मेरी समस्या हल हो गई है, मैं अभी भी जानना चाहूंगा।

+0

क्या आपके पास पहले से कोई निर्माता था? – Dsm

उत्तर

20

अपने निर्माता

inherited; 

में अपने निर्माता के समान पैरामीटर सूची के साथ निर्माता कहता है। आपके कन्स्ट्रक्टर में कोई पैरामीटर नहीं है, और इसलिए inheritedTObject में कुछ भी नहीं कन्स्ट्रक्टर कहता है। न केवल आपने अपना तुलनाकर्ता खो दिया है, लेकिन आपके उदाहरण में निर्माण के बाकी आवश्यक कदम गायब हैं।

जब आप

inherited Create; 

संकलक बजाय सामान्य विधि संकल्प प्रदर्शन से बदल दें। यह कक्षा पूर्वजों की सूची देखता है और यह पहली विधि को कॉल करता है जो यह कर सकता है। उस स्थिति में यह है:

constructor Create(ACapacity: Integer = 0); overload; 

इसलिए आपका उदाहरण सही ढंग से बनाया गया है।

प्रलेखन यहाँ है: http://docwiki.embarcadero.com/RADStudio/en/Methods#Inherited

कुंजी अंश इस प्रकार हैं:

विरासत में मिला एक सदस्य के नाम से पीछा किया जाता है, तो यह एक सामान्य विधि कॉल का प्रतिनिधित्व करता है

और

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

inherited; 

अक्सर रचनाकारों के कार्यान्वयन में होता है। यह विरासत कन्स्ट्रक्टर को उसी पैरामीटर के साथ कॉल करता है जो वंशज को पास किया गया था।

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

दूसरी तरफ inherited Create एक मानक विधि कॉल है। उस बाद के मामले में, आप उस पैरामीटर के डिफ़ॉल्ट मान का उपयोग करके एक पैरामीटर के साथ एक विधि को कॉल करना समाप्त कर देते हैं। तो ऐसा लगता है कि आप एक पैरामीटर रहित कन्स्ट्रक्टर को कॉल कर रहे हैं जो आप नहीं हैं। आप एक पैरामीटर, ACapacity, और 0 का मान गुजर रहे हैं।

+2

डिफ़ॉल्ट पैरामीटर के खतरों को हाइलाइट करना। इस मामले में, बिल्कुल समकक्ष कोड की तरह दिखता है: 'विरासत में मिला;' (समाप्त होता है) डिफ़ॉल्ट पैरामीटर रहित ctor को कॉल करना ** बनाम बनाम विरासत बनाएँ; 'जो * प्रकट होता है * विरासत में पैरामीटर रहित ctor को स्पष्ट रूप से कॉल करने के लिए ** बनाएं * * लेकिन वास्तव में एक * डिफ़ॉल्ट * पैरामीटर के साथ एक ctor के लिए हल करता है। अच्छी पकड़। – Deltics

-2

तुलनित्र एक ऐसा ऑब्जेक्ट है जिसे स्वयं बनाया जाना चाहिए। यदि आपके पास अपनी अवरोही कक्षा में कोई कन्स्ट्रक्टर नहीं था, तो मैं डिफ़ॉल्ट कन्स्ट्रक्टर बनने की अपेक्षा करता हूं क्योंकि आप निश्चित रूप से विरासत में कन्स्ट्रक्टर को कॉल करेंगे। यदि आप अपना खुद का कन्स्ट्रक्टर बनाते हैं तो आपको हमेशा विरासत में (मेरी राय में) कहा जाना चाहिए ताकि पूर्वजों को अपना काम करने की अनुमति मिल सके - इस मामले में डिफ़ॉल्ट तुलनित्र बनाते हैं।

+2

यह कुछ हद तक चौड़ा है जो मुझे डर लगता है –

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