विशेषता (कंप्यूटर प्रोग्रामिंग)

कंप्यूटर प्रोग्रामिंग में, एक ट्रैट प्रोग्रामिंग भाषा में प्रयुक्त एक अवधारणा है जो विधि (कंप्यूटर प्रोग्रामिंग) के एक सेट का प्रतिनिधित्व करती है जिसका उपयोग क्लास (कंप्यूटर विज्ञान) की कार्यक्षमता बढ़ाने के लिए किया जा सकता है।

तर्क
वस्तु-उन्मुख प्रोग्रामिंग में, व्यवहार कभी-कभी उन वर्गों के बीच साझा किया जाता है जो एक दूसरे से संबंधित नहीं होते हैं। उदाहरण के लिए, कई असंबद्ध वर्गों में ऑब्जेक्ट को जेएसओएन में क्रमबद्ध करने के तरीके हो सकते हैं। ऐतिहासिक रूप से, व्यवहार की आवश्यकता वाले प्रत्येक क्लास में कोड को अनुलिपि किए बिना इसे हल करने के लिए कई दृष्टिकोण रहे हैं। अन्य तरीकों में एकाधिक इन्हेरिटेन्स और मिक्सिन सम्मिलित हैं, लेकिन इनमें कमियां हैं: कोड का व्यवहार अप्रत्याशित रूप से बदल सकता है यदि मिक्सिन प्रयुक्त करने के क्रम में बदलाव किया जाता है, या यदि पैरेंट क्लास या मिक्सिन में नए तरीके जोड़े जाते हैं।

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

विशेषताएं
ट्रेट प्रोटोकॉल (इंटरफेस) और मिक्सिन के स्वरूपों को जोड़ते हैं। एक इंटरफ़ेस की तरह, एक ट्रैट एक या एक से अधिक फंक्शन प्रोटोटाइप को परिभाषित करती है, जिनमें से प्रयुक्त करने वाली क्लासेस को कार्यान्वयन प्रदान करना चाहिए। एक मिक्सिन की तरह, एक ट्रैट कार्यान्वयन क्लास के लिए अतिरिक्त व्यवहार प्रदान करती है।

विभिन्न गुणों द्वारा प्रदान की गई विधियों के बीच नामकरण संघट्टन के स्थिति में, प्रोग्रामर को स्पष्ट रूप से स्पष्ट करना चाहिए कि क्लास में इनमें से कौन सी विधियों का उपयोग किया जाएगा; इस प्रकार एकाधिक इन्हेरिटेन्स की हीरक की समस्या को मैन्युअल रूप से संशोधन करना। यह वस्तु-उन्मुख प्रोग्रामिंग में अन्य रचना विधियों से अलग है, जहां परस्पर विरोधी नाम स्कूपिंग (कम्प्यूटर विज्ञान) नियमों द्वारा स्वचालित रूप से संशोधित हो जाते हैं।

संचालन जो ट्रैट के साथ किए जा सकते हैं उनमें सम्मिलित हैं:
 * सममित योग: एक संचालक जो एक नई ट्रैट बनाने के लिए दो अलग-अलग ट्रैट को मिलाता है
 * ओवरराइड (या असममित योग): संचालक जो किसी सम्मिलित ट्रैट में विधियों को जोड़कर एक नई ट्रैट बनाता है, संभवतः इसके कुछ तरीकों को ओवरराइड करता है
 * अन्य नाम: एक संचालक जो सम्मिलित पद्धति के लिए एक नया नाम जोड़कर एक नया ट्रैट बनाता है
 * बहिष्करण: एक संचालक जो किसी सम्मिलित ट्रैट से एक विधि को हटाकर एक नया ट्रैट बनाता है। इसे उपनाम संचालक के साथ जोड़कर एक उथला नाम बदलें संचालक उत्पन्न होता है।

यदि किसी ट्रैट से किसी विधि को बाहर रखा गया है, तो वह विधि उस क्लास द्वारा प्रदान की जानी चाहिए जो ट्रैट का उपभोग करती है, या उस क्लास के पैरेंट क्लास द्वारा करता है। ऐसा इसलिए है क्योंकि ट्रैट द्वारा प्रदान की गई विधियाँ बहिष्कृत विधि कह सकती हैं।

ट्रैट रचना क्रमविनिमेय है अर्थात दिए गए ट्रैट A और B, A + B, B + A के समतुल्य हैं और साहचर्य अर्थात दिए गए ट्रेट A, B, और C, (A + B) + C, A + (B +) के समतुल्य C है।

सीमाएं
जबकि ट्रेट कई विकल्पों पर महत्वपूर्ण लाभ प्रदान करते हैं, उनकी अपनी सीमाएँ होती हैं।

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

बहिष्करण विधि
यदि किसी ट्रैट से किसी विधि को बाहर रखा जाता है, तो वह विधि ट्रैट के लिए एक 'आवश्यक' विधि बन जाती है क्योंकि ट्रैट के अन्य तरीके इसे कॉल कर सकते हैं।

समर्थित भाषाएँ
ट्रेट मूल रूप से प्रोग्रामिंग लैंग्वेज स्वयं (प्रोग्रामिंग भाषा)  से आते हैं और निम्नलिखित प्रोग्रामिंग भाषाओं द्वारा समर्थित हैं:


 * एम्बिएंट टॉक: सेल्फ ट्रेट्स (ऑब्जेक्ट-बेस्ड मल्टीपल इनहेरिटेंस) और स्मॉलटाक के चीख़  ट्रेट्स (प्रोग्रामर द्वारा ट्रैट की स्पष्ट रचना की आवश्यकता) के गुणों को जोड़ती है। यह राज्यों के भीतर राज्य को सक्षम करने के लिए स्टेटफुल और फ्रीज़ेबल ट्रैट पर शोध पर बनाता है, जिसे पहली परिभाषाओं में स्वीकृति नहीं दी गई थी।
 * C Sharp (प्रोग्रामिंग भाषा)|C#: संस्करण 8.0 के बाद से, C# में डिफ़ॉल्ट इंटरफ़ेस विधियों के लिए समर्थन है, जिनमें कुछ विशेष गुण होते हैं।
 * C++: सामान्य कंटेनर (डेटा संरचना) का समर्थन करने के लिए मानक टेम्पलेट लाइब्रेरी और C++ मानक लाइब्रेरी में उपयोग किया जाता है और बूस्ट सी ++ पुस्तकालयों को बढ़ावा दें टाइपट्रिट्स लाइब्रेरी में।
 * कर्ल (प्रोग्रामिंग भाषा) : मिक्सिन्स के रूप में सार क्लास विधि कार्यान्वयन की स्वीकृति देता है और इस प्रकार दूसरे नाम से ट्रेट बनाता है।
 * डी (प्रोग्रामिंग भाषा): संस्करण 2.003 के बाद से, __traits भाषा विस्तार और एसटीडी.ट्रेट्स मॉड्यूल सहायक टेम्प्लेट संकलन-समय ट्रेट प्रदान करते हैं। अन्य भाषा सुविधाओं (विशेष रूप से टेम्प्लेट और मिक्सिन) के साथ, वे इंटरफेस और प्रकारों के आधार पर लचीले स्वचालित पीढ़ी के तरीकों की स्वीकृति देते हैं। डी कई सदस्य वर्गों को अग्रेषित करने सहित सदस्य विधियों और चर के स्पष्ट अलियासिंग की भी स्वीकृति देता है।
 * किले (प्रोग्रामिंग भाषा)
 * ग्रूवी (प्रोग्रामिंग भाषा): संस्करण 2.3 के बाद से
 * हास्केल (प्रोग्रामिंग भाषा): हास्केल में, ट्रैट को क्लास टाइप करें  के रूप में जाना जाता है।
 * मिला हुआ : संस्करण 2.4.0 के बाद से। स्टेटिक एक्सटेंशन कहा जाता है मैनुअल में, यह उपयोग करता है  कीवर्ड
 * जावा (प्रोग्रामिंग भाषा): संस्करण 8 के बाद से, जावा में डिफ़ॉल्ट विधियों के लिए समर्थन है, जिनमें कुछ विशेष गुण होते हैं।
 * जावास्क्रिप्ट: कार्यों और प्रतिनिधिमंडलों के माध्यम से ट्रेट प्रयुक्त किए जा सकते हैं या पुस्तकालयों के माध्यम से जो गुण प्रदान करते हैं।
 * जूलिया (प्रोग्रामिंग भाषा): कई पैकेज ट्रैट को प्रयुक्त करते हैं, जैसे,
 * कोटलिन (प्रोग्रामिंग भाषा): ट्रैट को इंटरफेस कहा गया है M12 के बाद से।
 * कमंद (प्रोग्रामिंग भाषा)
 * OCaml: विभिन्न प्रकार की भाषा सुविधाओं का उपयोग करके ट्रैट को प्रयुक्त किया जा सकता है: मॉड्यूल और मॉड्यूल प्रकार का समावेशन, फ़ंक्टर और फ़ंक्टर प्रकार, क्लास और क्लास प्रकार की विरासत, वगैरह।
 * पर्ल: भूमिकाएं कहलाती हैं, वे मूस (पर्ल), रोल :: टिनी और रोल :: बेसिक जैसे पर्ल पुस्तकालयों में कार्यान्वित की जाती हैं। भूमिकाएँ बहन भाषा राकू (प्रोग्रामिंग भाषा) का हिस्सा हैं। कोरिन्ना ओओपी प्रस्ताव की स्वीकृति के साथ आधुनिक ओओपी प्रणाली के हिस्से के रूप में पर्ल की भाषा के मूल निवासी भूमिकाएं होंगी।
 * पीएचपी: संस्करण 5.4 के बाद से, PHP उपयोगकर्ताओं को उन टेम्पलेट्स को निर्दिष्ट करने की स्वीकृति देता है जो छद्म एकाधिक विरासत के रूप में एक से अधिक (ट्रैट-) क्लास से प्राप्त करने की क्षमता प्रदान करते हैं।
 * पायथन (प्रोग्रामिंग भाषा): एक तृतीय-पक्ष पुस्तकालय के माध्यम से, या उच्च-क्रम मिश्रित क्लासेस के माध्यम से
 * रैकेट (प्रोग्रामिंग भाषा): एक पुस्तकालय के रूप में ट्रैट का समर्थन करता है और उन्हें प्रयुक्त करने के लिए मैक्रोज़, संरचनाओं और प्रथम श्रेणी के वर्गों का उपयोग करता है।
 * रूबी (प्रोग्रामिंग भाषा): ट्रैट को प्रयुक्त करने के लिए मॉड्यूल मिक्सिन का उपयोग किया जा सकता है।
 * जंग (प्रोग्रामिंग भाषा)
 * स्काला (प्रोग्रामिंग भाषा) ट्रैट कुंजी शब्द के साथ समर्थित है.
 * स्मॉलटाक: स्मॉलटॉक, स्क्वीक की दो बोलियों में ट्रेट प्रयुक्त किए गए हैं एंड फिरौन.
 * स्विफ्ट (प्रोग्रामिंग भाषा): प्रोटोकॉल एक्सटेंशन के साथ ट्रेट प्रयुक्त किए जा सकते हैं।

सी #
C# 8.0 पर, इंटरफ़ेस के सदस्य के रूप में कार्यान्वयन को परिभाषित करना संभव है। यह एकाधिक विरासत के अनुकरण स्वरूपों की स्वीकृति देता है:

जंग
रस्ट में एक ट्रैट विधियों के एक सेट की घोषणा करती है जिसे एक प्रकार को प्रयुक्त करना चाहिए। रस्ट कंपाइलर्स को खोजे जाने वाले ट्रैट की आवश्यकता होती है, जो रस्ट में सामान्य प्रोग्रामिंग  की सुरक्षा सुनिश्चित करता है।

जैसे ट्रैट के थकाऊ और बार-बार कार्यान्वयन को सरल बनाने के लिए  और , द   मैक्रो का उपयोग कंपेलरों को स्वचालित रूप से कुछ कार्यान्वयन उत्पन्न करने के लिए अनुरोध करने के लिए किया जा सकता है। व्युत्पन्न ट्रैट में सम्मिलित हैं:  ,  ,  ,  ,  ,  ,  ,   और.

यह भी देखें

 * विस्तार विधि
 * इंटरफ़ेस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)
 * पैरामीट्रिक बहुरूपता
 * यूएफसीएस