2013-08-26 10 views
6

निम्नलिखित डेल्फी (एक्सई) में त्रुटि क्यों उत्पन्न करता है?जेनेरिक प्रकार पर विधि का आह्वान करें?

unit UTest; 

interface 


type 

TTest = class 
    public 
    procedure Foo<T>(A: T); 
end; 

implementation 

{ TTest } 

procedure TTest.Foo<T>(A: T); 
begin 
    A.Add('hej'); 
end; 

end. 

मैंने सोचा था कि डेल्फी में सामान्य प्रकार के बस सामान्य समारोह में डाला गया था, तो यह केवल बाहर त्रुटि होगा अगर एक प्रकार है जो एक जोड़ें (स्ट्रिंग) विधि की जरूरत नहीं है के साथ प्रयोग किया।

उत्तर

8

आपका कोड संकलन त्रुटि उत्पन्न करता है क्योंकि संकलक को यह जानने का कोई तरीका नहीं है कि T में Add नामक एक विधि है जो एक एकल स्ट्रिंग पैरामीटर प्राप्त करता है।

मैंने सोचा कि डेल्फी में जेनेरिक प्रकार सामान्य जेनेरिक फ़ंक्शन में डाले गए थे, इसलिए यह केवल उस त्रुटि के साथ उपयोग किया जाएगा जब कोई ऐड (स्ट्रिंग) विधि नहीं है।

यदि आप स्मॉलटॉक या सी ++ टेम्पलेट्स का उपयोग कर रहे थे, तो आपकी धारणा सटीक होगी। हालांकि, जेनेरिक टेम्पलेट्स के समान नहीं हैं। जेनेरिक के लिए आपको टाइप पैरामीटर में बाधा लागू करने की आवश्यकता है। बाधा को संकलक को बताने की ज़रूरत है कि T के गुण क्या हैं।

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

प्रलेखन लिंक: http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

सामान्य बाधाओं कि लागू किया जा सकता बल्कि सीमित हैं, जो एक शर्म की बात है। उदाहरण के लिए, मैं कुछ गणितीय ऑपरेटरों के लिए एक प्रकार को बाधित करने में सक्षम होना पसंद करूंगा। उदाहरण के लिए, मैं + और - ऑपरेटरों के पास एक प्रकार को बाध्य करने में सक्षम होना चाहता हूं। हालांकि, जेनेरिक और टेम्पलेट दोनों के लिए पेशेवर और विपक्ष हैं, और इसलिए मैं स्वीकार करता हूं कि ये सीमाएं डेल्फी भाषा डिजाइनरों द्वारा न्यायसंगत डिजाइन निर्णय का परिणाम हैं।

+0

कारण मैं उपर्युक्त करना चाहता हूं कि मेरे पास दो वर्ग हैं जो बेस क्लास (या इंटरफ़ेस) साझा नहीं करते हैं लेकिन कुछ विधि हस्ताक्षर बिल्कुल समान हैं। मुझे लगता है कि सीमित बाधाओं के साथ यह संभव नहीं है? – monoceres

+1

यह सही है। यदि ये टेम्पलेट थे तो आप ठीक होंगे। लेकिन आप जेनेरिक के साथ बस भाग्य से बाहर हैं। आपने एक ही समस्या को मारा है जो मुझे अच्छे गणितीय एल्गोरिदम लिखने से रोकता है जो स्केलर और जटिल मूल्यों दोनों पर काम कर सकता है। –

+1

यह बहुत बुरा है :(मुझे लगता है कि मुझे आरटीटीआई और if-statement (blersh) पर वापस जाना होगा। – monoceres

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