2010-01-23 14 views
6

Function overloading by return type?क्या डेल्फी में विभिन्न परिणाम प्रकार के आधार पर फ़ंक्शन को अधिभारित करने का कोई तरीका है?

वापसी प्रकार से समारोह ओवरलोडिंग पर तर्कसंगत पर एक बहुत विस्तृत जवाब है, और से मैं क्या देख सकते हैं डेल्फी इस की अनुमति नहीं है, लेकिन वहाँ किसी भी समाधान डेल्फी में विभिन्न वापसी प्रकार के आधार पर एक समारोह ओवरलोड हैं ?

उत्तर

9

रिकॉर्ड के लिए अंतर्निहित और स्पष्ट रूपांतरण ऑपरेटरों वापसी प्रकार से अधिक भार परमिट:

type 
    TFoo = record 
    class operator Implicit(const AFoo: TFoo): Integer; 
    class operator Implicit(const AFoo: TFoo): string; 
    end; 

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

test.pas(33) Error: E2251 Ambiguous overloaded call to 'Q' 
+ Test.pas(19) Related method: procedure Q(Integer); 
+ Test.pas(24) Related method: procedure Q(const string); 
+0

आह ठीक है, काफी जवाब नहीं जो मैं उम्मीद कर रहा था, लेकिन वैसे भी दिलचस्प। चीयर्स। – HMcG

7

आप पैरामीटर के रूप में "परिणाम" ले सकते हैं।

procedure Blah(InVar : word; out OutVar : Byte); overload; 
procedure Blah(InVar : word; out OutVar : String); overload; 
+0

हां, मैं ऐसा कर सकता है, लेकिन मैं एक घटक को अद्यतन करने रहा हूँ, और विधि वर्तमान में एक समारोह के रूप में लागू है, इसलिए यदि मैं एक प्रक्रिया कॉल में बदल गया, मुझे इसे कॉल करने वाले सभी कोड के माध्यम से वापस जाना होगा। – HMcG

1

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

पढ़ सकते हैं और एक टोकन केवल निम्न कोड की जरूरत है बदलने के लिए:

Myvalue := DataImporter.ImportToken; 

Myvalue के प्रकार पर निर्भर करता है, सही अंतर्निहित रूपांतरण शुरू हो रहा है।


कोड:

TTokenValue = record 
public 
    FValue:string; 
    constructor Create(const AValue:string); 
    class operator Implicit(const AFoo:TTokenValue): integer; 
    class operator Implicit(const AFoo:TTokenValue): string; 
end; 

कार्यान्वयन

function TDataImporter.ImportToken: TTokenValue; 
begin 
    result := TTokenValue.Create(GetCurrentToken()); 
end; 

constructor TTokenValue.Create(const AValue: string); 
begin 
    FValue := AValue; 
end; 

class operator TTokenValue.Implicit(const AFoo: TTokenValue): integer; 
begin 
    result := strtointdef(AFoo.FValue, 0); 
end; 

class operator TTokenValue.Implicit(const AFoo: TTokenValue): string; 
begin 
    result:=AFoo.FValue; 
end; 
संबंधित मुद्दे

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