2015-09-03 13 views
6

यह एक वास्तव में मूर्खतापूर्ण सवाल की तरह लग सकता है लेकिन मैं नहीं जानता कि क्यों यह भी संकलित करने के लिए अनुमति दी है:डेल्फी कन्स्ट्रक्टर पैरामीटर को गलत क्यों होने देता है?

program ConstructorWithParam; 

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils; 

type 

    TThing = class(TObject) 
    private 
    FParent: TObject; 
    public 
    constructor Create(const AParent: TObject); 
    end; 

{ TThing } 

constructor TThing.Create; // <- WTF? Why does the compiler not complain? 
begin 
    FParent := AParent; 
end; 

var 
    Thing: TThing; 
begin 
    try 
    Thing := TThing.Create(TObject.Create); 
    Readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

मैं डेल्फी XE5 उपयोग कर रहा हूँ और अन्य संस्करणों पर परीक्षण नहीं किया। धन्यवाद।

उत्तर

8

फॉर्म क्लास में पहली घोषणा सही मानी जाती है। कार्यान्वयन संस्करण आवश्यक पैरामीटर की पहचान करने की आवश्यकता नहीं है; वे मूल घोषणा द्वारा ग्रहण कर रहे हैं। यह भाषा का एक हिस्सा है।

यहाँ बिंदु को वर्णन करने के लिए एक अच्छा उदाहरण है:

type 
    TMyClass = class (Tobject) 
    procedure DoSometimg(DoA, DoB: Boolean); 
    end; 

कार्यान्वयन:

procedure TMyClass.DoSomething; // Note both parameters missing 
begin 
    if DoA then // Note not mentioned in implementation declaration 
    DoOneThing; // but still can be used here 
    if DoB then 
    DoAnotherThing; 
end; 

मैं व्यक्तिगत रूप से, दोनों कार्यान्वयन और इंटरफ़ेस घोषणाओं मैच बनाने के लिए है क्योंकि यह यह आसान पहचान करने के लिए बनाता है पसंद करते हैं कोड संपादक में जितना अधिक कूदते हुए पैरामीटर।

+0

धन्यवाद केन, मैं डेल्फी का उपयोग 15 वर्षों से कर रहा हूं और मुझे यह नहीं पता था! और मैं सहमत हूं - मैं कार्यान्वयन से मेल खाने के लिए इंटरफ़ेस पसंद करता हूं। मुझे लगता है कि एकमात्र समय यह सच नहीं है जब ओवरलोडिंग विधियों? –

+2

टर्बोपास्कल 5.0 ने इसे पेश किया। –

+0

ध्यान दें कि संकलक केवल तभी अनुमति देगा यदि कोई पैरामीटर निर्दिष्ट नहीं किया गया है, अगर उन्हें निर्दिष्ट किया गया है तो उन्हें मेल खाना चाहिए या संकलक शिकायत करेगा। यह पास्कल की एक भाषा विशेषता थी जो डेल्फी की पूर्व-तिथियां थीं। –

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