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

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

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

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

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

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

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

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

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

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

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

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

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


 * एम्बिएंट टॉक: सेल्फ ट्रेट्स (ऑब्जेक्ट-बेस्ड मल्टीपल इनहेरिटेंस) और स्मॉलटाक के चीख़  ट्रेट्स (प्रोग्रामर द्वारा लक्षणों की स्पष्ट रचना की आवश्यकता) के गुणों को जोड़ती है। यह राज्यों के भीतर राज्य को सक्षम करने के लिए स्टेटफुल और फ्रीज़ेबल लक्षणों पर शोध पर बनाता है, जिसे पहली परिभाषाओं में अनुमति नहीं दी गई थी।
 * 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 पर, इंटरफ़ेस के सदस्य के रूप में कार्यान्वयन को परिभाषित करना संभव है। यह एकाधिक विरासत के अनुकरण पहलुओं की अनुमति देता है:

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

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

यह भी देखें

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