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

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

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

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

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

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

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

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

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

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

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

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

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


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

C #
C# 8.0 पर, इंटरफ़ेस के मेमोरी के रूप में कार्यान्वयन को परिभाषित करना संभव है। using System; namespace CSharp8NewFeatures; interface ILogger {    // Traditional interface methods void Log(string message); void LogError(Exception exception); // Default interface method void LogWarning(string message) {        Console.WriteLine(message); }        } class Logger : ILogger {    public void Log(string message) {        Console.WriteLine(message); }    public void LogError(Exception exception) {        Console.WriteLine(exception.ToString); } } class Program {    static void Main(string[] args) {        ILogger logger = new Logger; logger.LogWarning("Some warning message"); } }

पीएचपी
यह उदाहरण अन्य वर्गों को बढ़ाने के लिए एक विशेषता का उपयोग करता है: // The template trait TSingleton {    private static $_instance = null; private function __construct {} // Must have private default constructor and be aware not to open it in the class public static function getInstance {        if (null === self::$_instance) { self::$_instance = new self; }        return self::$_instance; } } class FrontController {    use TSingleton; } // Can also be used in already extended classes class WebSite extends SomeClass {    use TSingleton; } यह एकाधिक इन्हेरिटेन्स के अनुकरण स्वरूपों की स्वीकृति देता है:

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

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

यह भी देखें

 * एक्सटेंशन विधि
 * इंटरफ़ेस (वस्तु उन्मुख प्रोग्रामिंग)
 * पैरामीट्रिक बहुरूपता
 * यूएफसीएस