9

मैं डेल्फी XE8 में एक वर्ग के निम्नलिखित घोषणा की है:वर्ग घोषणा में एक प्रकार पैरामीटर बाधा के रूप में ही वर्ग का उपयोग करना

TestClass = class; 
TestClass = class 
    function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error 
end; 

निम्नलिखित में से कौन संकलक त्रुटि फेंकता है:

E2086 Type 'TestClass' is not yet completely defined 

जब मैं जोड़ने मिश्रण के लिए एक और वर्ग और इसके बजाय एक बाधा के रूप में उपयोग करें, यह ठीक काम करता है:

AnotherTestClass = class 
end; 

TestClass = class; 
TestClass = class 
    function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error 
end; 

मुझे निलंबित समस्या यह है कि आगे की घोषणा घोषणा डेल्फी को प्रकार के बारे में अभी तक पर्याप्त नहीं बताती है।

TestClass = class; 
AnotherTestClass = class (TestClass) // Compiler Error 
end; 
TestClass = class 
    function test<T: AnotherTestClass>(supplier: TFunc<T>): T; 
end; 

मैं कुछ गलत कर रहा हूँ और यदि नहीं, वहाँ इस समस्या को हल एक तरीका है: यह शायद और अधिक स्पष्ट के बाद से निम्नलिखित समस्या को हल करने का प्रयास एक अलग लाइन पर बहुत ही संकलक त्रुटि फेंकता है?

+0

ऐसा लगता है कि इस संकलक में एक बग तो मैं एक [बग रिपोर्ट यहाँ] प्रस्तुत किया है (https://quality.embarcadero.com/ ब्राउज़ करें/आरएसपी 13348)। – overactor

+0

निश्चित रूप से कोड "TestClass = class; अन्य टेस्ट क्लास = वर्ग (टेस्ट क्लास) // कंपाइलर त्रुटि अंत;" दिखाए गए त्रुटि का उत्पादन करना चाहिए क्योंकि डेल्फी एक एकल पास कंपाइलर है। लेकिन मुझे कोई कारण नहीं दिख रहा है कि जिस निर्माण को आप बनाने की कोशिश कर रहे हैं उस पर लागू होना चाहिए। परिभाषा के वैध होने के समय पर्याप्त जानकारी उपलब्ध है। – Dsm

+0

@ डीएसएम सहमत हो गया, लेकिन चूंकि संकलक त्रुटि एक जैसी है, मुझे लगा कि यह गलत होने पर एक संकेत है। यह एक समस्या पेश करता है, हालांकि, अगर मैं दो वर्गों को एक दूसरे पैरामीटर बाधा के रूप में उपयोग करना चाहता हूं तो क्या होगा? – overactor

उत्तर

8

आप कुछ भी गलत नहीं कर रहे हैं। आप जो प्रयास कर रहे हैं वह संभव होना चाहिए, लेकिन संकलक मेरे विचार में दोषपूर्ण है। डिजाइन को पूरी तरह से बदलने के बिना इसके आसपास काम करने का कोई व्यवहार्य तरीका नहीं है। इस मुद्दे के आसपास काम करने का एक तरीका रनटाइम पर बाधा को लागू करना होगा। हालांकि, यह पूरी तरह से डिजाइन को बदलने के रूप में, मेरी आंखों में, गिनती होगी।

ध्यान दें कि .net तुम क्या करने कोशिश कर रहे हैं में पूरी तरह से संभव है:

class MyClass 
{ 
    private static T test<T>(Func<T> arg) where T : MyClass 
    { 
     return null; 
    } 
} 

डेल्फी जेनरिक सुविधा .net जेनरिक के आधार पर किया गया था और मैं नहीं बल्कि संदेह है कि समस्या आप का सामना करना एक निरीक्षण करने के लिए नीचे है डेल्फी डेवलपर्स के हिस्से पर।

आपको एक बग रिपोर्ट/सुविधा अनुरोध सबमिट करना चाहिए।

अद्यतन 1

LU आरडी एक बेहतर समाधान का पता चलता है। एक वर्ग सहायक का उपयोग करें:

type 
    TestClass = class 
    end; 

    TestClassHelper = class helper for TestClass 
    function test<T: TestClass>(supplier: TFunc<T>): T; 
    end; 

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

अद्यतन 2

बग रिपोर्ट: RSP-13348

+5

फ़ंक्शन को क्लास हेल्पर संकलन में स्थानांतरित करना: टेस्ट क्लास फ़ंक्शन टेस्ट के लिए टेस्ट क्लासहेल्पर = क्लास हेल्पर <टी: टेस्टक्लास> (आपूर्तिकर्ता: टीएफएनसी ): टी; अंत; '। –

+3

@LURD अच्छी पकड़, यह वास्तव में एक व्यावहारिक कामकाज है। कक्षा का व्यवहार और एपीआई क्या उद्देश्य था, समान होना चाहिए, है ना? हालांकि यह अभी भी teh संकलक में एक प्रमुख निरीक्षण है, इसलिए मैं अभी भी एक बग रिपोर्ट सबमिट करूंगा। – overactor

+2

कृपया अपनी बग रिपोर्ट के लिए यहां एक लिंक पोस्ट करें। यदि लोग जेनेरिक सुविधाओं को अधिक ऑर्थोगोनल और पूर्ण होना चाहते हैं तो लोग इसके लिए वोट दे सकते हैं। –

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

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