2010-05-26 15 views
6

मैं कोई ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो कोई भी TList लेता है और TList के सभी तत्वों का एक स्ट्रिंग प्रतिनिधित्व देता है।डेल्फी: स्ट्रिंग्स ऑब्जेक्ट्स नहीं हैं

मैं इतना

function ListToString(list:TList<TObject>):String; 

की तरह एक समारोह इस ठीक काम करता है की कोशिश की है, सिवाय इसके कि आप इसे करने के लिए एक TList<String> पारित नहीं कर सकते हैं।

E2010 Incompatible types: 'TList<System.TObject>' and 'TList<System.string>' 

डेल्फी में, एक स्ट्रिंग एक वस्तु नहीं है। इसे हल करने के लिए, मैंने एक दूसरा फ़ंक्शन लिखा है:

function StringListToString(list:TList<string>):String; 

क्या यह एकमात्र समाधान है? स्ट्रिंग को अधिक 'ऑब्जेक्ट-जैसी' के रूप में इलाज करने के अन्य तरीके हैं?

इसी तरह की नस में, मैं दो टीएलिस्टों की तुलना करने के लिए 'बराबर' फ़ंक्शन भी लिखना चाहता था। फिर मैं एक ही समस्या

function AreListsEqual(list1:TList<TObject>; list2:TList<TObject>):boolean; 

में चलाने वहाँ किसी भी तरह से इस समारोह (शायद जेनरिक का उपयोग कर?) लिखने के लिए है, तो यह भी एक TList<String> संभाल कर सकते हैं? स्ट्रिंग्स और ऑब्जेक्ट्स को संभालने वाले कोड बनाने की कोशिश करते समय मुझे कोई अन्य चाल या 'सर्वोत्तम प्रथाओं' के बारे में पता होना चाहिए? या मैं बस हर समारोह के दो संस्करण बनाते हैं? जेनिक्स मदद कर सकते हैं?

मैं जावा पृष्ठभूमि से हूं लेकिन अब डेल्फी में काम करता हूं। ऐसा लगता है कि वे हाल ही में जावा दुनिया से डेल्फी में बहुत सी चीजें जोड़ रहे हैं (या शायद सी # दुनिया, जो उन्हें जावा से कॉपी करता है)। बराबर() और हैशकोड() को टॉब्जेक्ट करने और एक जेनेरिक संग्रह फ्रेमवर्क इत्यादि बनाने की तरह। मुझे आश्चर्य है कि क्या ये जोड़ बहुत व्यावहारिक हैं यदि आप उनके साथ स्ट्रिंग्स का उपयोग नहीं कर सकते हैं।

[संपादित करें: किसी ने TStringList का उल्लेख किया है। मैंने अभी तक इसका उपयोग किया है, लेकिन मैं टीएलिस्ट के बारे में पूछ रहा हूं। मैं बाहर काम करने के अगर (स्ट्रिंग्स सहित) सब कुछ के लिए TList का उपयोग कर जाने के लिए एक क्लीनर तरीका है कोशिश कर रहा हूँ।]

+5

मैं वास्तव में 'TList ' का समर्थन करने में अधिक प्रयास नहीं करता; कोई भी इसका उपयोग नहीं करता है क्योंकि [यह 'TStringList'] से कम है (http://stackoverflow.com/questions/279471/tstringlist-vs-tliststring)। कहीं और अपने प्रयासों पर ध्यान केंद्रित करें। –

+0

TList की स्ट्रिंग प्रस्तुतिकरण कैसे दिखाई देगी? –

उत्तर

7

आपकी समस्या नहीं है कि string और TObject, असंगत प्रकार के होते हैं (वे कर रहे हैं, हालांकि,) यह है कि TList<x> है और TList<y> असंगत प्रकार हैं, भले ही x और y स्वयं नहीं हैं। कारण जटिल क्यों हैं, लेकिन मूल रूप से, यह इस तरह से चला जाता है।

कल्पना करें कि आपके फ़ंक्शन ने TList<TObject> स्वीकार किया है, और आप TList<TMyObject> में पारित हुए और यह काम किया। लेकिन फिर आपके फ़ंक्शन में आपने सूची में TIncompatibleObject जोड़ा। चूंकि फ़ंक्शन हस्ताक्षर केवल जानता है कि यह टॉब्जेक्ट्स की सूची के साथ काम कर रहा है, फिर यह काम करता है, और अचानक आपने एक आविष्कार का उल्लंघन किया है, और जब आप उस सूची में गणना करने की कोशिश करते हैं और TMYObject उदाहरणों का उपयोग करते हैं, तो कुछ विस्फोट होने की संभावना है।

यदि डेल्फी टीम ने सामान्य प्रकारों पर कॉन्वर्सिस और contravariance के लिए समर्थन जोड़ा तो आप सुरक्षित रूप से ऐसा कुछ करने में सक्षम होंगे, लेकिन दुर्भाग्य से वे अभी तक इसके आसपास नहीं मिल पाए हैं। उम्मीद है कि हम जल्द ही इसे देखेंगे।

लेकिन अपने मूल प्रश्न पर वापस जाने के लिए, यदि आप स्ट्रिंग्स की सूची की तुलना करना चाहते हैं, तो जेनिक्स का उपयोग करने की कोई आवश्यकता नहीं है; डेल्फी में क्लास यूनिट में मिले TStringList नामक एक विशिष्ट सूची-स्ट्रिंग क्लास है, जिसका आप उपयोग कर सकते हैं। इसमें स्ट्रिंग हैंडलिंग के लिए बहुत सारी अंतर्निहित कार्यक्षमता है, जिसमें सभी स्ट्रिंग्स को एक स्ट्रिंग में संयोजित करने के तीन तरीके शामिल हैं: टेक्स्ट, कॉमाटेक्स्ट और डेलीमिटेड टेक्स्ट गुण।

+1

मैं जोड़ना भूल गया था कि मैं TList , TStringList नहीं, के बारे में बात कर रहा हूं। डी 2010 से पहले मैंने टीस्ट्रिंगलिस्ट का इस्तेमाल किया, लेकिन मैं उससे अधिक वर्दी एपीआई (यानी टीएलआईस्ट) के साथ कुछ दूर जाने की कोशिश कर रहा हूं। मैं अपना प्रश्न संपादित करूंगा। – awmross

+0

इसलिए मैं अपने ListToString फ़ंक्शन में उदाहरण के लिए एक TList पास नहीं कर सकता। समझा! ListToString के फ़ंक्शन हस्ताक्षर को लिखने का कोई और तरीका है, इसलिए मैं * 'TList ' पास कर सकता हूं? – awmross

+2

@awmross: ठीक है, आप फ़ंक्शन को एक सामान्य प्रकार दे सकते हैं। 'फ़ंक्शन ListToString (सूची: TList ): स्ट्रिंग;' यह काम करेगा। लेकिन फिर संकलक टी की प्रकृति के बारे में कुछ भी नहीं मान सकता है, इसलिए आप इसे किसी ऑब्जेक्ट के रूप में नहीं देख सकते हैं। (जब तक आप टी पर कक्षा की बाधा या विशिष्ट श्रेणी की बाधा डालते हैं, लेकिन तब आप तारों का उपयोग नहीं कर सके।) असल में, जेनेरिक उपयोगी हैं लेकिन वे सबकुछ का अंतिम जवाब नहीं हैं। –

0

यह क्लीनर नहीं है। यह बदतर है। यह TStringList के बजाय TList<String> का उपयोग करने के लिए मूल रूप से बीएडी विचार है।

यह कहना साफ नहीं है कि "मैं हर जगह जेनेरिक का उपयोग करता हूं"। वास्तव में, यदि आप लगातार बने रहना चाहते हैं, तो उन्हें कहीं भी उपयोग न करें। उनसे बचें, जैसे अधिकांश डेल्फी डेवलपर्स प्लेग की तरह उनसे बचते हैं।

वीसीएल में तारों की सभी "सूचियां" प्रकार TStringList प्रकार हैं। अधिकांश डेल्फी ऐप्स में ऑब्जेक्ट्स के अधिकांश संग्रह टेम्पलेट प्रकार के बजाय, TObjectList का उपयोग करते हैं।

यह पूरे डेल्फी प्लेटफ़ॉर्म के साथ कम से कम संगत और अधिक सुसंगत नहीं है, और कुछ अजीब चीज लेने के लिए और उस पर मानकीकृत है, जब यह आप होगा, और आप अकेले, इस अजीब बात को कर रहे हैं।

असल में, मुझे अभी भी यकीन नहीं है कि जेनेरिक भारी उपयोग करने के लिए सुरक्षित हैं।

यदि आप टीएलआईस्ट का उपयोग करना शुरू करते हैं तो आप इसे अपने मेमो में स्पष्ट रूप से कॉपी नहीं कर पाएंगे। लाइन जो एक TStringList है, और आप एक प्रकार की असंगतता बनाएंगे, कुछ भी नहीं, साथ ही आप अतिरिक्त कार्यक्षमता खो देंगे TStringList। और TStringList.Text का उपयोग करने के बजाय आपको अपने लिए यह आविष्कार करना होगा। आप LoadFromFile और SaveToFile भी खो देते हैं, और बहुत कुछ। तारों की Arrays डेल्फी में एक सर्वव्यापी चीज हैं, और वे लगभग हमेशा एक TStringList हैं। TList<String> लंगड़ा है।

+1

मौजूदा पुस्तकालयों के साथ इंटरऑपरेबिलिटी निश्चित रूप से कुछ माना जाना चाहिए। TStringList के साथ असंगतता इस तथ्य में निहित है कि यदि आप स्ट्रिंग के अलावा किसी अन्य चीज़ की सूची चाहते हैं, तो आपको TStringList (e। के साथ पूरी तरह से असंगत कुछ का उपयोग करना होगा।जी एक टॉब्जेक्टलिस्ट)। – awmross

+0

आप इसे गलत कर रहे हैं। डेल्फी स्ट्रिंग प्रकार मौलिक प्रकार हैं। ऐसा लगता है जैसे आप उन्हें वस्तुओं के लिए चाहते हैं। लेकिन वे नहीं हैं। न तो एक प्रकार की वस्तु पूर्णांक हैं। इसके साथ रहने के लिए जानें। –

+0

जावा में सभी प्रकारों में एक सामान्य रूट नहीं है –

1

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

मैं केवल आपकी समस्या का हल करने का सुझाव दे रहा हूं, मैं इस बात से सहमत नहीं हूं कि स्थिरता के लिए स्थिरता कोड को बेहतर बनाती है। यदि आपको इसकी आवश्यकता है, डेल्फी ऑब्जेक्ट पास्कल पसंद की भाषा नहीं हो सकता है।

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