डेल्फी क्लास (और रिकॉर्ड) हेल्पर्स को समझना

डेल्फी भाषा की एक विशेषता कुछ साल पहले (जिस तरह से वापस आ गई थी डेल्फी 2005 में) को "क्लास हेल्पर्स" कहा जाता है जो आपको क्लास (रिकॉर्ड) के लिए नए तरीके पेश करके एक मौजूदा क्लास (या रिकॉर्ड) में नई कार्यक्षमता जोड़ने के लिए बनाया गया है।

नीचे आपको कक्षा सहायकों के लिए कुछ और विचार दिखाई देंगे + जानें कि कक्षा सहायकों को कब और कहाँ उपयोग नहीं करना है।

क्लास हेल्पर के लिए...

सरल शब्दों में, एक क्लास हेल्पर एक ऐसा निर्माण होता है, जो हेल्पर क्लास में नए तरीकों को पेश करके एक क्लास का विस्तार करता है। एक क्लास हेल्पर आपको मौजूदा क्लास को वास्तव में संशोधित किए बिना या उससे विरासत में प्राप्त करने की अनुमति देता है।

वीसीएल के टस्टर्स वर्ग का विस्तार करने के लिए आप निम्नलिखित की तरह एक क्लास हेल्पर की घोषणा करेंगे और उसे लागू करेंगे:

प्रकार
TStringsHelper = के लिए क्लास हेल्पर TStrings। जनतासमारोह शामिल हैं (स्थिरांक aString: string): बूलियन; समाप्त; 

उपरोक्त वर्ग, जिसे "TStringsHelper" कहा जाता है, TStrings प्रकार का एक सहायक है। ध्यान दें कि TStrings, Classes.pas में परिभाषित किया गया है, एक इकाई जो डिफ़ॉल्ट रूप से किसी के लिए उपयोग खंड में उपलब्ध है डेल्फी उदाहरण के लिए फार्म की इकाई।

instagram viewer

हमारे क्लास हेल्पर का उपयोग करते हुए हम जिस फ़ंक्शन को TStrings प्रकार में जोड़ रहे हैं वह "Contains" है। कार्यान्वयन की तरह लग सकता है:

समारोह TStringsHelper। शामिल हैं (स्थिरांक aString: string): बूलियन; शुरू
परिणाम: = -1 <> IndexOf (aString); समाप्त; 

मुझे यकीन है कि आपने अपने कोड में कई बार उपरोक्त का उपयोग किया है - यह जांचने के लिए कि क्या TStringList की तरह कुछ TStrings वंशज हैं, इसके आइटम संग्रह में कुछ स्ट्रिंग मान हैं।

ध्यान दें कि, उदाहरण के लिए, एक की आइटम संपत्ति TComboBox या एक TListBox TStrings प्रकार का है।

TStringsHelper कार्यान्वित होने के बाद, और एक फ़ॉर्म पर एक सूची बॉक्स (जिसका नाम "ListBox1") है, अब आप जाँच सकते हैं कि क्या कुछ स्ट्रिंग सूची बॉक्स का एक हिस्सा है जिसका उपयोग करके संपत्ति गुण:

अगर ListBox1.Items। शामिल हैं ('कुछ स्ट्रिंग') फिर... 

क्लास हेल्पर्स गो और नो गो

कक्षा सहायकों के कार्यान्वयन में कुछ सकारात्मक और कुछ (आप सोच सकते हैं) आपके कोडिंग पर नकारात्मक प्रभाव डालते हैं।

सामान्य तौर पर आपको अपनी खुद की कक्षाएं बढ़ाने से बचना चाहिए - जैसे कि आपको कुछ नई कार्यक्षमता जोड़ने की आवश्यकता है अपने स्वयं के कस्टम वर्ग - कक्षा के कार्यान्वयन में सीधे नया सामान जोड़ें - एक वर्ग का उपयोग नहीं करना सहायक।

वर्ग सहायकों को इसलिए वर्ग का विस्तार करने के लिए डिज़ाइन किया जाता है जब आप सामान्य वर्ग की विरासत और इंटरफ़ेस कार्यान्वयन पर भरोसा नहीं कर सकते (या करने की आवश्यकता नहीं है)।

एक क्लास हेल्पर नए निजी क्षेत्रों (या ऐसे क्षेत्रों को पढ़ने / लिखने) के लिए उदाहरण डेटा की घोषणा नहीं कर सकता है। नए वर्ग फ़ील्ड जोड़ने की अनुमति है।

एक क्लास हेल्पर नए तरीकों (फ़ंक्शन, प्रक्रिया) को जोड़ सकता है।

डेल्फी एक्सई 3 से पहले आप केवल कक्षाओं और रिकॉर्डों को बढ़ा सकते थे - जटिल प्रकार। डेल्फी एक्सई 3 रिलीज से आप सरल प्रकार जैसे कि पूर्णांक या स्ट्रिंग या TDateTime का विस्तार कर सकते हैं, और जैसे निर्माण कर सकते हैं:

वर
s: स्ट्रिंग; शुरू
s: = 'डेल्फी एक्सई 3 हेल्पर्स'; s: = s। अपरकेस। रिवर्स; समाप्त; 

मैं निकट भविष्य में डेल्फी एक्सई 3 सरल प्रकार सहायक के बारे में लिखूंगा।

जहां मेरा क्लास हेल्पर है

कक्षा सहायकों का उपयोग करने के लिए एक सीमा जो आपको "पैर में अपने आप को गोली मारने" में मदद कर सकती है, वह तथ्य यह है कि आप एक ही प्रकार के कई सहायकों को परिभाषित और संबद्ध कर सकते हैं। हालांकि, स्रोत कोड में किसी भी विशिष्ट स्थान पर केवल शून्य या एक सहायक लागू होता है। निकटतम दायरे में परिभाषित सहायक लागू होगा। क्लास या रिकॉर्ड हेल्पर का स्कोप सामान्य में निर्धारित किया जाता है डेल्फी फैशन (उदाहरण के लिए, यूनिट के उपयोग खंड में बाएं से दाएं)।

इसका मतलब यह है कि आप दो अलग-अलग इकाइयों में दो TStringsHelper वर्ग सहायकों को परिभाषित कर सकते हैं, लेकिन केवल तब लागू होंगे जब वास्तव में उपयोग किया जाता है!

यदि एक क्लास हेल्पर उस इकाई में परिभाषित नहीं किया जाता है जहां आप इसके शुरू किए गए तरीकों का उपयोग करते हैं - जो कि ज्यादातर मामलों में ऐसा होगा, तो आप नहीं जानते कि आप वास्तव में किस क्लास हेल्पर कार्यान्वयन का उपयोग कर रहे हैं। TStrings के लिए दो वर्ग सहायकों, अलग-अलग नाम या अलग-अलग इकाइयों में रहने वाले उपरोक्त उदाहरण में "Contains" विधि के लिए अलग-अलग कार्यान्वयन हो सकते हैं।

उपयोग या नहीं?

हाँ, लेकिन संभावित दुष्प्रभावों से अवगत रहें।

यहाँ ऊपर वर्णित TStringsHelper क्लास हेल्पर का एक और उपयोगी विस्तार दिया गया है


TStringsHelper = के लिए क्लास हेल्पर TStrings। निजीसमारोह GetTheObject (स्थिरांक एक स्ट्रिंग: तार): टोब्जेक्ट; प्रक्रिया SetTheObject (स्थिरांक एक स्ट्रिंग: तार; स्थिरांक मूल्य: TObject); जनतासंपत्ति ObjectFor [स्थिरांक एक स्ट्रिंग: तार]: टोब्जेक्ट पढ़ना GetTheObject लिखना SetTheObject; समाप्त;... समारोह TStringsHelper। GetTheObject (स्थिरांक एक स्ट्रिंग: तार): टोब्जेक्ट; वर
idx: पूर्णांक; शुरू
परिणाम: = नील; idx: = IndexOf (aString); अगर idx> -1 फिर परिणाम: = वस्तुएँ [आईडीएक्स]; समाप्त; प्रक्रिया TStringsHelper। SetTheObject (स्थिरांक एक स्ट्रिंग: तार; स्थिरांक मूल्य: TObject); वर
idx: पूर्णांक; शुरू
idx: = IndexOf (aString); अगर idx> -1 फिर वस्तुओं [आईडीएक्स]: = मूल्य; समाप्त; 

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