विधि (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(12 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{short description|Function that is tied to a particular instance or class}}
{{short description|Function that is tied to a particular instance or class}}
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (OOP) में एक '''विधि''' एक [[संदेश देना|संदेश]] और एक वस्तु से जुड़ी एक [[प्रक्रिया (कंप्यूटर विज्ञान)|प्रक्रिया]] है। एक वस्तु में ''राज्य डेटा'' और व्यवहार होते हैं, ये एक इंटरफ़ेस बनाते हैं, जो निर्दिष्ट करता है कि वस्तु का उपयोग इसके विभिन्न उपभोक्ताओं द्वारा किया जा सकता है। एक विधि उपभोक्ता द्वारा पैरामीट्रिज्ड ऑब्जेक्ट का व्यवहार है।
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) में '''विधि''' [[संदेश देना|संदेश]] और वस्तु से जुड़ी एक [[प्रक्रिया (कंप्यूटर विज्ञान)|प्रक्रिया]] होती है। वस्तु में ''डेटा'' और व्यवहार होते है, जो इंटरफ़ेस बनाते है, जो निर्दिष्ट करते है कि वस्तु का उपयोग इसके विभिन्न उपभोक्ताओं द्वारा किया जा सकता है। एक विधि उपभोक्ता द्वारा प्राचलीकरण ऑब्जेक्ट का व्यवहार होता है।


डेटा को वस्तु की [[संपत्ति (प्रोग्रामिंग)]] के रूप में दर्शाया जाता है, और व्यवहार को विधियों के रूप में दर्शाया जाता है। उदाहरण के लिए, एक <code>Window</code> ऑब्जेक्ट में <code>open</code> और <code>close</code> जैसे तरीके हो सकते हैं, जबकि इसकी स्थिति (चाहे वह किसी भी समय खुली या बंद हो) एक संपत्ति होगी।
डेटा को वस्तु के [[संपत्ति (प्रोग्रामिंग)|गुण]] के रूप में दर्शाया जाता है, और व्यवहार को विधियों के रूप में दर्शाया जाता है। उदाहरण के लिए, एक <code>Window</code> ऑब्जेक्ट में <code>open</code> और <code>close</code> जैसी विधियाँ हो सकती है, जबकि इसकी स्थिति (चाहे वह किसी भी समय खुली या बंद हो) एक गुण होती है।


क्लास-आधारित प्रोग्रामिंग में, विधियों को एक वर्ग के भीतर परिभाषित किया जाता है, और ऑब्जेक्ट किसी दिए गए वर्ग के [[उदाहरण (कंप्यूटर विज्ञान)]] होते हैं। विधि द्वारा प्रदान की जाने वाली सबसे महत्वपूर्ण क्षमताओं में से एक विधि ओवरराइडिंग है - एक ही नाम (जैसे, क्षेत्र) का उपयोग कई अलग-अलग प्रकार की कक्षाओं के लिए किया जा सकता है। यह भेजने वाली वस्तुओं को व्यवहारों को लागू करने और उन व्यवहारों के कार्यान्वयन को प्राप्त करने वाली वस्तु को सौंपने की अनुमति देता है। [[जावा (प्रोग्रामिंग भाषा)|जावा]] प्रोग्रामिंग में एक विधि क्लास ऑब्जेक्ट के व्यवहार को सेट करती है। उदाहरण के लिए, एक वस्तु किसी अन्य वस्तु को एक क्षेत्र संदेश भेज सकती है और उपयुक्त सूत्र लागू किया जाता है कि क्या प्राप्त वस्तु एक <code>rectangle</code>, <code>circle</code>, <code>triangle</code>, आदि है।
वर्ग-आधारित प्रोग्रामिंग में, विधियों को एक वर्ग के भीतर परिभाषित किया जाता है, और ऑब्जेक्ट किसी दिए गए वर्ग के [[उदाहरण (कंप्यूटर विज्ञान)|उदाहरण]] होते है। विधि द्वारा प्रदान की जाने वाली सबसे महत्वपूर्ण क्षमताओं में से एक विधि ओवरराइडिंग है - एक ही नाम (जैसे, क्षेत्र) का उपयोग कई अलग-अलग प्रकार के वर्ग के लिए किया जाता है। यह भेजने वाली वस्तुओं को व्यवहारों को लागू करने और उन व्यवहारों के कार्यान्वयन को प्राप्त करने वाली वस्तु को सौंपने की अनुमति देता है। [[जावा (प्रोग्रामिंग भाषा)|जावा]] प्रोग्रामिंग में एक विधि वर्ग ऑब्जेक्ट के व्यवहार को सेट करता है। उदाहरण के लिए, एक वस्तु किसी अन्य वस्तु को एक क्षेत्र संदेश भेज सकती है और उपयुक्त सूत्र लागू किया जाता है कि क्या प्राप्त वस्तु एक <code>rectangle</code>, <code>circle</code>, <code>triangle</code>, आदि है।


विधियाँ इंटरफ़ेस भी प्रदान करती हैं जिसका उपयोग अन्य वर्ग किसी वस्तु के गुणों तक पहुँचने और संशोधित करने के लिए करते हैं, इसे एनकैप्सुलेशन के रूप में जाना जाता है। एनकैप्सुलेशन और ओवरराइडिंग विधियों और प्रक्रिया कॉल के बीच दो प्राथमिक विशिष्ट विशेषताएं हैं।<ref>{{cite web|title=What is an Object?|url=http://docs.oracle.com/javase/tutorial/java/concepts/object.html|work=oracle.com|publisher=Oracle Corporation|access-date=13 December 2013}}</ref>
विधियाँ इंटरफ़ेस भी प्रदान करती है जिसका उपयोग अन्य वर्ग किसी वस्तु के गुणों तक पहुँचने और संशोधित करने के लिए करते है, इसे एनकैप्सुलेशन के रूप में जाना जाता है। एनकैप्सुलेशन और ओवरराइडिंग विधियों और प्रक्रिया के बीच दो प्राथमिक विशिष्ट विशेषताएं होती है।<ref>{{cite web|title=What is an Object?|url=http://docs.oracle.com/javase/tutorial/java/concepts/object.html|work=oracle.com|publisher=Oracle Corporation|access-date=13 December 2013}}</ref>
== ओवरराइडिंग और ओवरलोडिंग ==
== ओवरराइडिंग और ओवरलोडिंग ==
मेथड ओवरराइडिंग और ओवरलोडिंग दो सबसे महत्वपूर्ण तरीके हैं जो एक पारंपरिक प्रक्रिया या फ़ंक्शन कॉल से भिन्न होते हैं। ओवरराइडिंग अपने सुपरक्लास की एक विधि के कार्यान्वयन को फिर से परिभाषित करने वाले उपवर्ग को संदर्भित करता है। उदाहरण के लिए, <code>findArea</code> एक आकृति वर्ग,<ref name=":0" /> <code>triangle</code>, आदि पर परिभाषित एक विधि हो सकती है, प्रत्येक अपने क्षेत्र की गणना करने के लिए उपयुक्त सूत्र को परिभाषित करेगा। विचार यह है कि वस्तुओं को "ब्लैक बॉक्स" के रूप में देखा जाए ताकि वस्तु के आंतरिक भाग में परिवर्तन का उपयोग करने वाली अन्य वस्तुओं पर कम से कम प्रभाव डाला जा सके। इसे एनकैप्सुलेशन के रूप में जाना जाता है और इसका उद्देश्य कोड को बनाए रखना और पुन: उपयोग करना आसान बनाना है।
विधि ओवरराइडिंग और ओवरलोडिंग दो सबसे महत्वपूर्ण विधियाँ होती है जो एक पारंपरिक प्रक्रिया या फ़ंक्शन से भिन्न होती है। ओवरराइडिंग अपने सुपरवर्ग की एक विधि के कार्यान्वयन को फिर से परिभाषित करने वाले उपवर्ग को संदर्भित करता है। उदाहरण के लिए, <code>findArea</code> एक आकृति वर्ग,<ref name=":0" /> <code>triangle</code>, आदि पर परिभाषित एक विधि होती है, प्रत्येक अपने क्षेत्र की गणना करने के लिए उपयुक्त सूत्र को परिभाषित करते है। विचार यह है कि वस्तुओं को "ब्लैक बॉक्स" के रूप में देखा जाता है जिससे कि वस्तु के आंतरिक भाग में परिवर्तन का उपयोग करने वाली अन्य वस्तुओं पर कम से कम प्रभाव डाला जा सकता है। इसे एनकैप्सुलेशन के रूप में जाना जाता है और इसका उद्देश्य कोड को बनाए रखना और पुन: उपयोग करके आसान बनाना होता है।


दूसरी ओर, मेथड ओवरलोडिंग, विधि के मापदंडों के आधार पर एक संदेश को संभालने के लिए उपयोग किए जाने वाले कोड को अलग करने के लिए संदर्भित करता है। यदि कोई प्राप्त वस्तु को किसी भी विधि में पहले पैरामीटर के रूप में देखता है तो ओवरराइडिंग ओवरलोडिंग का एक विशेष मामला है जहां चयन केवल पहले तर्क पर आधारित होता है। निम्न सरल जावा उदाहरण अंतर दिखाता है:
दूसरी ओर, विधि ओवरलोडिंग, विधि के मापदंडों के आधार पर एक संदेश को संभालने के लिए उपयोग किए जाने वाले कोड को अलग करने के लिए संदर्भित करता है। यदि कोई प्राप्त वस्तु को किसी भी विधि में पहले मापदण्ड के रूप में देखता है तो ओवरराइडिंग ओवरलोडिंग की एक विशेष स्थिति होती है जहां चयन केवल पहले तर्क पर आधारित होता है।
 
== एक्सेसर, म्यूटेटर और मैनेजर मेथड्स ==
किसी वस्तु के डेटा मान को पढ़ने के लिए [[एक्सेसर विधि]]यों का उपयोग किया जाता है। किसी वस्तु के डेटा को संशोधित करने के लिए Mutator विधियों का उपयोग किया जाता है। प्रबंधक विधियों का उपयोग किसी वर्ग की वस्तुओं को प्रारंभ करने और नष्ट करने के लिए किया जाता है, उदा। निर्माणकर्ता और विध्वंसक।
 
ये विधियाँ एक [[अमूर्त परत]] प्रदान करती हैं जो [[एनकैप्सुलेशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] और [[प्रतिरूपकता (प्रोग्रामिंग)]] की सुविधा प्रदान करती हैं। उदाहरण के लिए, यदि कोई बैंक-खाता वर्ग a <code>getBalance()</code> एक्सेसर विधि वर्तमान बैलेंस (लेखांकन) को पुनः प्राप्त करने के लिए (शेष डेटा फ़ील्ड को सीधे एक्सेस करने के बजाय), फिर उसी कोड का बाद में [[संशोधन नियंत्रण]] शेष राशि पुनर्प्राप्ति के लिए एक अधिक जटिल तंत्र को लागू कर सकता है (उदाहरण के लिए, एक [[डेटाबेस]] फ़ेच), आश्रित कोड के बिना बदलने की जरूरत है। एनकैप्सुलेशन और मॉड्यूलरिटी की अवधारणाएं ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए अद्वितीय नहीं हैं। दरअसल, कई मायनों में ऑब्जेक्ट-ओरिएंटेड दृष्टिकोण पिछले प्रतिमानों का तार्किक विस्तार है जैसे अमूर्त डेटा प्रकार और [[संरचित प्रोग्रामिंग]]।<ref>{{cite book|last=Meyer|first=Bertrand|title=Object-Oriented Software Construction|year=1988|publisher=Prentice Hall International Series in Computer Science|location=Cambridge|isbn=0-13-629049-3|pages=52–54}}</ref>


== एक्सेसर, म्यूटेटर और प्रबंधक विधियाँ ==
किसी वस्तु के डेटा मान को पढ़ने के लिए [[एक्सेसर विधि|एक्सेसर विधियों]] का उपयोग किया जाता है। किसी वस्तु के डेटा को संशोधित करने के लिए म्यूटेटर विधियों का उपयोग किया जाता है। प्रबंधक विधियों का उपयोग किसी वर्ग की वस्तुओं को प्रारंभ करने और नष्ट करने के लिए किया जाता है। उदाहरण के लिए, निर्माणकर्ता और विध्वंसक।


ये विधियाँ एक [[अमूर्त परत]] प्रदान करती है जो [[एनकैप्सुलेशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|इनकैप्सुलेशन]] और [[प्रतिरूपकता (प्रोग्रामिंग)|प्रतिरूपकता]] की सुविधा प्रदान करती है। उदाहरण के लिए, यदि एक बैंक-खाता वर्ग वर्तमान शेष राशि को पुनः प्राप्त करने के लिए एक <code>getBalance()</code> एक्सेसर विधि प्रदान करता है (अतिरिक्त सीधे शेष राशि डेटा क्षेत्र तक पहुँचने के लिए), तो उसी कोड के बाद के संशोधन शेष राशि पुनर्प्राप्ति के लिए एक अधिक जटिल तंत्र को लागू करती है (उदाहरण के लिए, एक [[डेटाबेस]] फ़ेच)। एनकैप्सुलेशन और मॉड्यूलरिटी की अवधारणाएं ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए अद्वितीय नहीं होती है। दरअसल, कई मायनों में वस्तु-उन्मुख दृष्टिकोण पिछले प्रतिमानों का तार्किक विस्तार होता है, जैसे सार डेटा प्रकार और [[संरचित प्रोग्रामिंग]]।<ref>{{cite book|last=Meyer|first=Bertrand|title=Object-Oriented Software Construction|year=1988|publisher=Prentice Hall International Series in Computer Science|location=Cambridge|isbn=0-13-629049-3|pages=52–54}}</ref>
=== कंस्ट्रक्टर ===
=== कंस्ट्रक्टर ===
एक कंस्ट्रक्टर (कंप्यूटर साइंस) एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल की शुरुआत में वस्तु को बनाने और आरंभ करने के लिए कहा जाता है, एक प्रक्रिया जिसे [[वस्तु निर्माण]] (या तात्कालिकता) कहा जाता है। प्रारंभ में संसाधनों का अधिग्रहण शामिल हो सकता है। कंस्ट्रक्टर्स में पैरामीटर हो सकते हैं लेकिन आमतौर पर अधिकांश भाषाओं में वैल्यू नहीं लौटाते हैं। जावा में निम्न उदाहरण देखें:
कंस्ट्रक्टर एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल की शुरुआत में ऑब्जेक्ट बनाने और आरंभ करने के लिए कहा जाता है, यह एक प्रक्रिया है जिसे [[वस्तु निर्माण]] कहा जाता है। प्रारंभ में संसाधनों का अधिग्रहण सम्मलित होता है। कंस्ट्रक्टर्स में मापदण्ड होते है लेकिन सामान्यतः अधिकांश भाषाओं में मूल्य नहीं लौटाते है। जावा में निम्न उदाहरण देखें:
 
public class Main {
<वाक्यविन्यास प्रकाश लैंग = जावा>
  String _name;
सार्वजनिक वर्ग मुख्य {
  int _roll;
    स्ट्रिंग _नाम;
    इंट _रोल;
  Main(String name, int roll) { // constructor method
 
    this._name = name;
    मुख्य (स्ट्रिंग नाम, इंट रोल) {// कंस्ट्रक्टर विधि
    this._roll = roll;
        यह._नाम = नाम;
  }
        यह._रोल = रोल;
}
    }
}
</वाक्यविन्यास हाइलाइट>


=== विध्वंसक ===
=== विध्वंसक ===
एक [[विध्वंसक (कंप्यूटर विज्ञान)]] एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल के अंत में स्वचालित रूप से कहा जाता है, एक प्रक्रिया जिसे [[वस्तु जीवनकाल]] कहा जाता है। अधिकांश भाषाओं में विनाश विध्वंसक विधि तर्कों की अनुमति नहीं देता है और न ही मूल्यों को लौटाता है। विनाश को लागू किया जा सकता है ताकि वस्तु विनाश पर सफाई कार्य और अन्य कार्य किए जा सकें।
[[विध्वंसक (कंप्यूटर विज्ञान)|विध्वंसक]] एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल को स्वचालित रूप से अंत करने के लिए कहा जाता है, यह एक प्रक्रिया है जिसे विनाश कहा जाता है। अधिकांश भाषाओं में विनाश विध्वंसक विधि तर्कों की अनुमति नहीं देता है और न ही मूल्यों को लौटाता है। विनाश को लागू किया जा सकता है जिससे कि वस्तु विनाश पर सफाई कार्य और अन्य कार्य किए जा सकें।
 
==== [[finalizer]]्स ====
[[कचरा संग्रह (कंप्यूटर विज्ञान)]] में | कचरा-संग्रहित भाषाएँ, जैसे कि जावा (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा) | सी #, और [[पायथन (प्रोग्रामिंग भाषा)]], विध्वंसक को फाइनलाइज़र के रूप में जाना जाता है। उनके पास विनाशकों के लिए एक समान उद्देश्य और कार्य है, लेकिन कचरा-संग्रह और मैन्युअल स्मृति प्रबंधन वाली भाषाओं का उपयोग करने वाली भाषाओं के बीच अंतर के कारण, जिस क्रम में उन्हें बुलाया जाता है वह अलग है।
 
== सार तरीके ==
एक अमूर्त विधि केवल एक [[विधि हस्ताक्षर]] और कोई [[विधि निकाय]] नहीं है। यह अक्सर निर्दिष्ट करने के लिए प्रयोग किया जाता है कि एक उपवर्ग को विधि का कार्यान्वयन प्रदान करना चाहिए। कुछ प्रोग्रामिंग भाषाओं में [[इंटरफ़ेस (कंप्यूटिंग)]] निर्दिष्ट करने के लिए सार विधियों का उपयोग किया जाता है।<ref>{{cite web|title=Abstract Methods and Classes|url=http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html|website=oracle.com|publisher=Oracle Java Documentation|access-date=11 December 2014}}</ref>


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


== सार विधियाँ ==
एक सार विधि केवल एक [[विधि हस्ताक्षर]] नहीं होती है। यह अधिकांशतः निर्दिष्ट करने के लिए प्रयोग किया जाता है कि एक उपवर्ग को विधि का कार्यान्वयन प्रदान करना चाहिए। कुछ प्रोग्रामिंग भाषाओं में [[इंटरफ़ेस (कंप्यूटिंग)|इंटरफ़ेस]] निर्दिष्ट करने के लिए सार विधियों का उपयोग किया जाता है।<ref>{{cite web|title=Abstract Methods and Classes|url=http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html|website=oracle.com|publisher=Oracle Java Documentation|access-date=11 December 2014}}</ref>
=== उदाहरण ===
=== उदाहरण ===
निम्नलिखित जावा (प्रोग्रामिंग भाषा) कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:
निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:
 
abstract class Shape {
<वाक्यविन्यास प्रकाश लैंग = जावा>
  abstract int area(int h, int w); // abstract method signature
सार वर्ग आकार {
}
    अमूर्त इंट क्षेत्र (इंट एच, इंट डब्ल्यू); // सार विधि हस्ताक्षर
}
</वाक्यविन्यास हाइलाइट>
निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:
निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:
 
public class Rectangle extends Shape {
<वाक्यविन्यास प्रकाश लैंग = जावा>
  @Override
सार्वजनिक वर्ग आयत आकार बढ़ाता है {
  int area(int h, int w) {
    @Override
    return h * w;
    इंट एरिया (इंट एच, इंट डब्ल्यू) {
  }
        वापसी एच * डब्ल्यू;
}
    }
}
</वाक्यविन्यास हाइलाइट>
 
=== पुनर्संरचना ===
=== पुनर्संरचना ===
यदि एक उपवर्ग एक सार विधि के लिए एक कार्यान्वयन प्रदान करता है, तो दूसरा उपवर्ग इसे फिर से सार बना सकता है। इसे पुनर्संरचना कहते हैं।
यदि एक उपवर्ग एक सार विधि के लिए एक कार्यान्वयन प्रदान करता है, तो दूसरा उपवर्ग इसे फिर से सार बना सकता है। इसे पुनर्संरचना कहते है।


व्यवहार में, यह शायद ही कभी प्रयोग किया जाता है।
व्यवहार में, यह संभवतः ही कभी प्रयोग किया जाता है।


==== उदाहरण ====
==== उदाहरण ====
सी # में, वर्चुअल विधि को सार विधि से ओवरराइड किया जा सकता है। (यह जावा पर भी लागू होता है, जहां सभी गैर-निजी तरीके आभासी हैं।)
सी शार्प में, वर्चुअल विधि को सार विधि से ओवरराइड किया जा सकता है। (यह जावा पर भी लागू होता है, जहां सभी गैर-निजी विधियाँ होती है।)
<वाक्यविन्यास प्रकाश लैंग = csharp>
class IA
कक्षा आईए
{
{
  public virtual void M() { }
    सार्वजनिक आभासी शून्य एम () {}
}
}
abstract class IBs: IA
सार वर्ग आईबी: IA
{
{
  public override abstract void M(); // allowed
    सार्वजनिक ओवरराइड अमूर्त शून्य एम (); // अनुमत
}
}
</वाक्यविन्यास हाइलाइट>
 
इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)
इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)
<वाक्यविन्यास प्रकाश लैंग = csharp>
interface IA
इंटरफ़ेस आईए
{
{
  void M() { }
    शून्य एम () {}
}
}
interface IBe: IA
इंटरफ़ेस आईबी: आइए
{
{
  abstract void IA.M();
    सार शून्य IA.M ();
}
}
class C : IB { } // error: class 'C' does not implement 'IA.M'.
कक्षा सी: आईबी {} // त्रुटि: कक्षा 'सी' 'आईएएम' लागू नहीं करती है।
== वर्ग के विधियाँ ==
</वाक्यविन्यास हाइलाइट>
वर्ग विधियाँ वे विधियाँ है जिन्हें उदाहरण के अतिरिक्त वर्ग पर बुलाया जाता है। वे सामान्यतः ऑब्जेक्ट [[मेटा मॉडल]] के हिस्से के रूप में उपयोग किए जाते है। अर्थात, प्रत्येक वर्ग के लिए, मेटा-मॉडल में वर्ग ऑब्जेक्ट का एक उदाहरण परिभाषित किया गया है। मेटा-मॉडल प्रोटोकॉल वर्गों को बनाने और हटाने की अनुमति देता है। इस अर्थ में, वे ऊपर वर्णित कंस्ट्रक्टर्स और विध्वंसक के समान कार्यक्षमता प्रदान करता है। लेकिन कुछ भाषाएँ जैसे [[कॉमन लिस्प ऑब्जेक्ट सिस्टम|कॉमन लिस्प ऑब्जेक्ट प्रणाली]] (सीएलओएस) में मेटा-मॉडल डेवलपर को रन टाइम पर ऑब्जेक्ट मॉडल को गतिशील रूप से बदलने की अनुमति देता है। उदाहरण के लिए, नए वर्ग बनाने के लिए, वर्ग पदानुक्रम को फिर से परिभाषित करना, गुणों को संशोधित करना आदि।


== कक्षा के तरीके ==
== विशेष विधियाँ ==
क्लास मेथड्स वे मेथड्स हैं जिन्हें इंस्टेंस के बजाय क्लास (कंप्यूटर प्रोग्रामिंग) पर कॉल किया जाता है। वे आम तौर पर ऑब्जेक्ट [[मेटा मॉडल]] के हिस्से के रूप में उपयोग किए जाते हैं। यानी, प्रत्येक वर्ग के लिए, मेटा-मॉडल में क्लास ऑब्जेक्ट का एक उदाहरण परिभाषित किया गया है। [[मेटा-ऑब्जेक्ट प्रोटोकॉल]] | मेटा-मॉडल प्रोटोकॉल कक्षाओं को बनाने और हटाने की अनुमति देते हैं। इस अर्थ में, वे ऊपर वर्णित कंस्ट्रक्टर्स और डिस्ट्रक्टर्स के समान कार्यक्षमता प्रदान करते हैं। लेकिन कुछ भाषाओं में जैसे [[कॉमन लिस्प ऑब्जेक्ट सिस्टम]] | कॉमन लिस्प ऑब्जेक्ट सिस्टम (CLOS) मेटा-मॉडल डेवलपर को रन टाइम पर [[वस्तु मॉडल]] को गतिशील रूप से बदलने की अनुमति देता है: उदाहरण के लिए, नई कक्षाएं बनाने के लिए, क्लास पदानुक्रम को फिर से परिभाषित करें, गुणों को संशोधित करें , वगैरह।
विशेष विधियाँ बहुत भाषा-विशिष्ट होती है और एक भाषा यहाँ परिभाषित किसी भी विशेष विधियों का समर्थन नहीं कर सकती है। एक भाषा का संकलक स्वचालित रूप से डिफ़ॉल्ट विशेष विधियों को उत्पन्न कर सकता है या एक प्रोग्रामर को विशेष विधियों को वैकल्पिक रूप से परिभाषित करने की अनुमति देता है। अधिकांश विशेष विधियों को सीधे नहीं बुलाया जा सकता है, जबकि संकलक उन्हें उचित समय पर करने के लिए कोड उत्पन्न करता है।


== विशेष तरीके ==
=== स्थैतिक विधियाँ ===
विशेष विधियाँ बहुत भाषा-विशिष्ट हैं और एक भाषा यहाँ परिभाषित किसी भी, कुछ या सभी विशेष विधियों का समर्थन नहीं कर सकती है। एक भाषा का संकलक स्वचालित रूप से डिफ़ॉल्ट विशेष विधियों को उत्पन्न कर सकता है या एक प्रोग्रामर को विशेष विधियों को वैकल्पिक रूप से परिभाषित करने की अनुमति दी जा सकती है। अधिकांश विशेष विधियों को सीधे नहीं बुलाया जा सकता है, बल्कि संकलक उन्हें उचित समय पर कॉल करने के लिए कोड उत्पन्न करता है।
स्थैतिक विधियाँ किसी विशिष्ट उदाहरण के अतिरिक्त किसी वर्ग के सभी उदाहरणों के लिए प्रासंगिक होती है। वे उस अर्थ में [[स्थैतिक चर]] के समान होती है। एक उदाहरण एक वर्ग के प्रत्येक उदाहरण के सभी चर के मानों को योग करने के लिए एक स्थिर विधि होती है। उदाहरण के लिए, यदि कोई <code>Product</code> वर्ग होता तो उसके पास सभी उत्पादों की औसत कीमत की गणना करने के लिए एक स्थिर विधि हो सकती थी।


=== स्थिर तरीके ===
जावा में, सामान्यतः उपयोग की जाने वाली स्थैतिक विधि है:
स्थैतिक विधियाँ किसी विशिष्ट उदाहरण के बजाय किसी वर्ग के सभी उदाहरणों के लिए प्रासंगिक होती हैं। वे उस अर्थ में [[स्थैतिक चर]] के समान हैं। एक उदाहरण एक वर्ग के प्रत्येक उदाहरण के सभी चर के मानों को योग करने के लिए एक स्थिर विधि होगी। उदाहरण के लिए, यदि कोई थे <code>Product</code> क्लास में सभी उत्पादों की औसत कीमत की गणना करने के लिए एक स्थिर विधि हो सकती है।
  Math.max(double a, double b)
 
जावा में, आमतौर पर इस्तेमाल की जाने वाली स्थैतिक विधि है:
  Math.max (डबल ए, डबल बी)
इस स्थैतिक विधि का कोई स्वामित्व नहीं है और यह किसी उदाहरण पर नहीं चलता है। यह अपने तर्कों से सारी जानकारी प्राप्त करता है।<ref name=":0">{{Cite book|title = Clean Code: A Handbook of Agile Software Craftsmanship|last = Martin|first = Robert C.|publisher = Prentice Hall|year = 2009|isbn = 978-0-13-235088-4|pages = 296|author-link = Robert Cecil Martin}}</ref>
इस स्थैतिक विधि का कोई स्वामित्व नहीं है और यह किसी उदाहरण पर नहीं चलता है। यह अपने तर्कों से सारी जानकारी प्राप्त करता है।<ref name=":0">{{Cite book|title = Clean Code: A Handbook of Agile Software Craftsmanship|last = Martin|first = Robert C.|publisher = Prentice Hall|year = 2009|isbn = 978-0-13-235088-4|pages = 296|author-link = Robert Cecil Martin}}</ref>
यदि वर्ग का कोई उदाहरण अभी तक मौजूद नहीं है, तब भी एक स्थिर विधि को लागू किया जा सकता है। स्टेटिक विधियों को स्थैतिक कहा जाता है क्योंकि उन्हें उस वर्ग के आधार पर [[संकलन समय]] पर हल किया जाता है जिस पर उन्हें कॉल किया जाता है और गतिशील रूप से उदाहरण विधियों के मामले में नहीं होता है, जो कि ऑब्जेक्ट के रनटाइम प्रकार के आधार पर बहुरूपी रूप से हल किया जाता है।


=== कॉपी-असाइनमेंट ऑपरेटर ===
यदि वर्ग का कोई उदाहरण अभी तक उपस्तिथ नहीं है, तब भी एक स्थिर विधि को लागू किया जा सकता है। स्टेटिक विधियों को "स्थैतिक" कहा जाता है क्योंकि उन्हें उस वर्ग के आधार पर [[संकलन समय|संकलित समय]] पर हल किया जाता है, उदाहरण विधियों के स्थिति में, ऑब्जेक्ट के रनटाइम प्रकार के आधार पर बहुरूपी रूप से हल किया जाता है।
कॉपी-असाइनमेंट ऑपरेटर्स कंपाइलर द्वारा की जाने वाली क्रियाओं को परिभाषित करते हैं जब एक क्लास ऑब्जेक्ट को उसी प्रकार के क्लास ऑब्जेक्ट को असाइन किया जाता है।


===ऑपरेटर के तरीके ===
=== कॉपी-असाइनमेंट ऑपरेटर्स ===
ऑपरेटर के तरीके [[ऑपरेटर ओवरलोडिंग]] करते हैं और प्रतीक और संबंधित विधि मापदंडों के साथ किए जाने वाले संचालन को परिभाषित करते हैं। सी ++ उदाहरण:
कॉपी-असाइनमेंट ऑपरेटर्स संकलक द्वारा की जाने वाली क्रियाओं को परिभाषित करता है जब एक वर्ग ऑब्जेक्ट को उसी प्रकार के वर्ग ऑब्जेक्ट से असाइन किया जाता है।
<वाक्यविन्यास लैंग = सीपीपी>
#शामिल <स्ट्रिंग>


वर्ग डेटा {
===ऑपरेटर की विधियाँ ===
जनता:
ऑपरेटर की विधियाँ [[ऑपरेटर ओवरलोडिंग]] करती है और प्रतीक और संबंधित विधि मापदंडों के साथ किए जाने वाले संचालन को परिभाषित करती है। सी++ उदाहरण:
   बूल ऑपरेटर <(स्थिरांक डेटा और डेटा) कास्ट {रिटर्न रोल_ <डेटा.रोल_; }
#include <string>
   बूल ऑपरेटर == (स्थिरांक डेटा और डेटा) स्थिरांक {
    रिटर्न नाम_ == डेटा.नाम_ && रोल_ == डेटा.रोल_;
class Data {
  public:
   bool operator<(const Data& data) const { return roll_ < data.roll_; }
   bool operator==(const Data& data) const {
  return name_ == data.name_ && roll_ == data.roll_;
   }
   }
  private:
  std::string name_;
  int roll_;
};


निजी:
== सदस्य सी++ में कार्य करता है ==
  एसटीडी :: स्ट्रिंग नाम_;
उन भाषाओं के लिए बड़े कौशल सेट होते है और कोड का लाभ उठाने के लिए कुछ प्रक्रियात्मक भाषाओं को वस्तु-उन्मुख क्षमताओं के साथ विस्तारित किया गया है। संभवतः सबसे प्रसिद्ध उदाहरण सी++ है, जो सी प्रोग्रामिंग भाषा का ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन है। किसी उपस्थित प्रक्रियात्मक भाषा में वस्तु-उन्मुख प्रतिमान को जोड़ने के लिए डिज़ाइन की आवश्यकताओं के कारण, सी++ में पास होने वाले संदेश में कुछ अनूठी क्षमताएं और शब्दावलियां होती है। उदाहरण के लिए, सी++ में एक विधि को मेंबर फंक्शन के रूप में जाना जाता है। सी++ में आभासी कार्यों की अवधारणा भी है जो सदस्य कार्य है जिन्हें व्युत्पन्न वर्गों में ओवरराइड किया जाता है और [[गतिशील प्रेषण]] की अनुमति देता है।
  इंट रोल_;
};
</वाक्यविन्यास हाइलाइट>
 
== [[सी ++]] == में सदस्य कार्य करता है
उन भाषाओं के लिए बड़े कौशल सेट और विरासत कोड का लाभ उठाने के लिए कुछ प्रक्रियात्मक भाषाओं को वस्तु-उन्मुख क्षमताओं के साथ विस्तारित किया गया था, लेकिन फिर भी वस्तु-उन्मुख विकास के लाभ प्रदान करते हैं। शायद सबसे प्रसिद्ध उदाहरण C++ है, जो C (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज का एक ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन है। किसी मौजूदा प्रक्रियात्मक भाषा में वस्तु-उन्मुख प्रतिमान को जोड़ने के लिए डिज़ाइन की आवश्यकताओं के कारण, C++ में पास होने वाले संदेश में कुछ अनूठी क्षमताएं और शब्दावलियां हैं। उदाहरण के लिए, C++ में एक मेथड को मेंबर फंक्शन के रूप में जाना जाता है। सी ++ में आभासी कार्यों की अवधारणा भी है जो सदस्य कार्य हैं जो व्युत्पन्न कक्षाओं में ओवरराइडिंग विधि हो सकती हैं और [[गतिशील प्रेषण]] की अनुमति देती हैं।


=== आभासी कार्य ===
=== आभासी कार्य ===
वर्चुअल फ़ंक्शंस वे साधन हैं जिनके द्वारा C ++ वर्ग बहुरूपी व्यवहार प्राप्त कर सकता है। गैर-आभासी सदस्य कार्य, या नियमित तरीके, वे हैं जो [[बहुरूपता (कंप्यूटर विज्ञान)]] में भाग नहीं लेते हैं।
वर्चुअल फ़ंक्शंस वे साधन है जिनके द्वारा सी++ वर्ग बहुरूपी व्यवहार प्राप्त करते है। गैर-आभासी सदस्य कार्य, या नियमित विधियाँ, वे है जो [[बहुरूपता (कंप्यूटर विज्ञान)]] में भाग नहीं लेते है।


सी ++ उदाहरण:
सी++ उदाहरण:
<वाक्यविन्यास लैंग = सीपीपी>
#include <iostream>
#शामिल <iostream>
#include <memory>
#शामिल <मेमोरी>
 
class Super {
क्लास सुपर {
  public:
जनता:
   virtual ~Super() = default;
   आभासी ~ सुपर () = डिफ़ॉल्ट;
 
   virtual void IAm() { std::cout << "I'm the super class!\n"; }
   आभासी शून्य IAm () {std::cout << मैं सुपर क्लास हूँ!\n; }
};
};
 
class Sub : public Super {
क्लास सब: पब्लिक सुपर {
  public:
जनता:
   void IAm() override { std::cout << "I'm the subclass!\n"; }
   शून्य IAm() ओवरराइड {std::cout << मैं उपवर्ग हूँ!\n; }
};
};
 
int main() {
मुख्य प्रवेश बिंदु() {
   std::unique_ptr<Super> inst1 = std::make_unique<Super>();
   std::unique_ptr<Super> inst1 = std::make_unique<Super>();
   std::unique_ptr<Super> inst2 = std::make_unique<Sub>();
   std::unique_ptr<Super> inst2 = std::make_unique<nowiki><Sub>();</nowiki>
 
   inst1->IAm(); // कॉल | सुपर :: आईएएम |
   inst1->IAm(); // Calls |Super::IAm|.
   inst2->IAm(); // कॉल | Sub::IAm|.
   inst2->IAm(); // Calls |Sub::IAm|.
}
}
</वाक्यविन्यास हाइलाइट>


== यह भी देखें ==
== यह भी देखें ==
* संपत्ति (प्रोग्रामिंग)
* गुण (प्रोग्रामिंग)
* [[दूरस्थ विधि मंगलाचरण]]
* [[दूरस्थ विधि मंगलाचरण]]
* उपनेमका, जिसे उपप्रोग्राम, दिनचर्या, प्रक्रिया या कार्य भी कहा जाता है
* उपनेमका, जिसे उपप्रोग्राम, दिनचर्या, प्रक्रिया या कार्य भी कहा जाता है
Line 183: Line 160:


{{DEFAULTSORT:Method (Computer Science)}}
{{DEFAULTSORT:Method (Computer Science)}}
<!--Categories-->[[Category: विधि (कंप्यूटर प्रोग्रामिंग) | विधि (कंप्यूटर प्रोग्रामिंग) ]] [[Category: C++ कोड उदाहरण के साथ लेख]]
<!--Categories-->


[[sv:Funktion (programmering)#Metod]]
[[sv:Funktion (programmering)#Metod]]


 
[[Category:C++ कोड उदाहरण के साथ लेख|Method (Computer Science)]]
 
[[Category:Created On 17/02/2023|Method (Computer Science)]]
[[Category: Machine Translated Page]]
[[Category:Lua-based templates|Method (Computer Science)]]
[[Category:Created On 17/02/2023]]
[[Category:Machine Translated Page|Method (Computer Science)]]
[[Category:Pages with script errors|Method (Computer Science)]]
[[Category:Short description with empty Wikidata description|Method (Computer Science)]]
[[Category:Templates Vigyan Ready|Method (Computer Science)]]
[[Category:Templates that add a tracking category|Method (Computer Science)]]
[[Category:Templates that generate short descriptions|Method (Computer Science)]]
[[Category:Templates using TemplateData|Method (Computer Science)]]
[[Category:विधि (कंप्यूटर प्रोग्रामिंग)| विधि (कंप्यूटर प्रोग्रामिंग) ]]

Latest revision as of 10:16, 20 March 2023

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

डेटा को वस्तु के गुण के रूप में दर्शाया जाता है, और व्यवहार को विधियों के रूप में दर्शाया जाता है। उदाहरण के लिए, एक Window ऑब्जेक्ट में open और close जैसी विधियाँ हो सकती है, जबकि इसकी स्थिति (चाहे वह किसी भी समय खुली या बंद हो) एक गुण होती है।

वर्ग-आधारित प्रोग्रामिंग में, विधियों को एक वर्ग के भीतर परिभाषित किया जाता है, और ऑब्जेक्ट किसी दिए गए वर्ग के उदाहरण होते है। विधि द्वारा प्रदान की जाने वाली सबसे महत्वपूर्ण क्षमताओं में से एक विधि ओवरराइडिंग है - एक ही नाम (जैसे, क्षेत्र) का उपयोग कई अलग-अलग प्रकार के वर्ग के लिए किया जाता है। यह भेजने वाली वस्तुओं को व्यवहारों को लागू करने और उन व्यवहारों के कार्यान्वयन को प्राप्त करने वाली वस्तु को सौंपने की अनुमति देता है। जावा प्रोग्रामिंग में एक विधि वर्ग ऑब्जेक्ट के व्यवहार को सेट करता है। उदाहरण के लिए, एक वस्तु किसी अन्य वस्तु को एक क्षेत्र संदेश भेज सकती है और उपयुक्त सूत्र लागू किया जाता है कि क्या प्राप्त वस्तु एक rectangle, circle, triangle, आदि है।

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

ओवरराइडिंग और ओवरलोडिंग

विधि ओवरराइडिंग और ओवरलोडिंग दो सबसे महत्वपूर्ण विधियाँ होती है जो एक पारंपरिक प्रक्रिया या फ़ंक्शन से भिन्न होती है। ओवरराइडिंग अपने सुपरवर्ग की एक विधि के कार्यान्वयन को फिर से परिभाषित करने वाले उपवर्ग को संदर्भित करता है। उदाहरण के लिए, findArea एक आकृति वर्ग,[2] triangle, आदि पर परिभाषित एक विधि होती है, प्रत्येक अपने क्षेत्र की गणना करने के लिए उपयुक्त सूत्र को परिभाषित करते है। विचार यह है कि वस्तुओं को "ब्लैक बॉक्स" के रूप में देखा जाता है जिससे कि वस्तु के आंतरिक भाग में परिवर्तन का उपयोग करने वाली अन्य वस्तुओं पर कम से कम प्रभाव डाला जा सकता है। इसे एनकैप्सुलेशन के रूप में जाना जाता है और इसका उद्देश्य कोड को बनाए रखना और पुन: उपयोग करके आसान बनाना होता है।

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

एक्सेसर, म्यूटेटर और प्रबंधक विधियाँ

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

ये विधियाँ एक अमूर्त परत प्रदान करती है जो इनकैप्सुलेशन और प्रतिरूपकता की सुविधा प्रदान करती है। उदाहरण के लिए, यदि एक बैंक-खाता वर्ग वर्तमान शेष राशि को पुनः प्राप्त करने के लिए एक getBalance() एक्सेसर विधि प्रदान करता है (अतिरिक्त सीधे शेष राशि डेटा क्षेत्र तक पहुँचने के लिए), तो उसी कोड के बाद के संशोधन शेष राशि पुनर्प्राप्ति के लिए एक अधिक जटिल तंत्र को लागू करती है (उदाहरण के लिए, एक डेटाबेस फ़ेच)। एनकैप्सुलेशन और मॉड्यूलरिटी की अवधारणाएं ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए अद्वितीय नहीं होती है। दरअसल, कई मायनों में वस्तु-उन्मुख दृष्टिकोण पिछले प्रतिमानों का तार्किक विस्तार होता है, जैसे सार डेटा प्रकार और संरचित प्रोग्रामिंग[3]

कंस्ट्रक्टर

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

public class Main {
  String _name;
  int _roll;

  Main(String name, int roll) { // constructor method
    this._name = name;
    this._roll = roll;
  }
}

विध्वंसक

विध्वंसक एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल को स्वचालित रूप से अंत करने के लिए कहा जाता है, यह एक प्रक्रिया है जिसे विनाश कहा जाता है। अधिकांश भाषाओं में विनाश विध्वंसक विधि तर्कों की अनुमति नहीं देता है और न ही मूल्यों को लौटाता है। विनाश को लागू किया जा सकता है जिससे कि वस्तु विनाश पर सफाई कार्य और अन्य कार्य किए जा सकें।

फ़ाइनलाइज़र

कचरा एकत्रित करने वाली भाषाओं में, जैसे कि जावा, सी शार्प, और पायथन, विध्वंसक को फाइनलाइज़र के रूप में जाना जाता है। उनके पास विनाशकों के लिए एक समान उद्देश्य और कार्य होता है, लेकिन उन भाषाओं के बीच अंतर के कारण जो कचरा-संग्रह और मैन्युअल स्मृति प्रबंधन वाली भाषाओं का उपयोग करता है, जिस क्रम में उन्हें बुलाया जाता है वह अलग होते है।

सार विधियाँ

एक सार विधि केवल एक विधि हस्ताक्षर नहीं होती है। यह अधिकांशतः निर्दिष्ट करने के लिए प्रयोग किया जाता है कि एक उपवर्ग को विधि का कार्यान्वयन प्रदान करना चाहिए। कुछ प्रोग्रामिंग भाषाओं में इंटरफ़ेस निर्दिष्ट करने के लिए सार विधियों का उपयोग किया जाता है।[4]

उदाहरण

निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:

abstract class Shape {
  abstract int area(int h, int w); // abstract method signature
}

निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:

public class Rectangle extends Shape {
  @Override
  int area(int h, int w) {
    return h * w;
  }
}

पुनर्संरचना

यदि एक उपवर्ग एक सार विधि के लिए एक कार्यान्वयन प्रदान करता है, तो दूसरा उपवर्ग इसे फिर से सार बना सकता है। इसे पुनर्संरचना कहते है।

व्यवहार में, यह संभवतः ही कभी प्रयोग किया जाता है।

उदाहरण

सी शार्प में, वर्चुअल विधि को सार विधि से ओवरराइड किया जा सकता है। (यह जावा पर भी लागू होता है, जहां सभी गैर-निजी विधियाँ होती है।)

class IA
{
  public virtual void M() { }
}
abstract class IBs: IA
{
  public override abstract void M(); // allowed
}

इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)

interface IA
{
  void M() { }
}
interface IBe: IA
{
  abstract void IA.M();
}
class C : IB { } // error: class 'C' does not implement 'IA.M'.

वर्ग के विधियाँ

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

विशेष विधियाँ

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

स्थैतिक विधियाँ

स्थैतिक विधियाँ किसी विशिष्ट उदाहरण के अतिरिक्त किसी वर्ग के सभी उदाहरणों के लिए प्रासंगिक होती है। वे उस अर्थ में स्थैतिक चर के समान होती है। एक उदाहरण एक वर्ग के प्रत्येक उदाहरण के सभी चर के मानों को योग करने के लिए एक स्थिर विधि होती है। उदाहरण के लिए, यदि कोई Product वर्ग होता तो उसके पास सभी उत्पादों की औसत कीमत की गणना करने के लिए एक स्थिर विधि हो सकती थी।

जावा में, सामान्यतः उपयोग की जाने वाली स्थैतिक विधि है:

Math.max(double a, double b)

इस स्थैतिक विधि का कोई स्वामित्व नहीं है और यह किसी उदाहरण पर नहीं चलता है। यह अपने तर्कों से सारी जानकारी प्राप्त करता है।[2]

यदि वर्ग का कोई उदाहरण अभी तक उपस्तिथ नहीं है, तब भी एक स्थिर विधि को लागू किया जा सकता है। स्टेटिक विधियों को "स्थैतिक" कहा जाता है क्योंकि उन्हें उस वर्ग के आधार पर संकलित समय पर हल किया जाता है, उदाहरण विधियों के स्थिति में, ऑब्जेक्ट के रनटाइम प्रकार के आधार पर बहुरूपी रूप से हल किया जाता है।

कॉपी-असाइनमेंट ऑपरेटर्स

कॉपी-असाइनमेंट ऑपरेटर्स संकलक द्वारा की जाने वाली क्रियाओं को परिभाषित करता है जब एक वर्ग ऑब्जेक्ट को उसी प्रकार के वर्ग ऑब्जेक्ट से असाइन किया जाता है।

ऑपरेटर की विधियाँ

ऑपरेटर की विधियाँ ऑपरेटर ओवरलोडिंग करती है और प्रतीक और संबंधित विधि मापदंडों के साथ किए जाने वाले संचालन को परिभाषित करती है। सी++ उदाहरण:

#include <string>

class Data {
 public:
 bool operator<(const Data& data) const { return roll_ < data.roll_; }
 bool operator==(const Data& data) const {
  return name_ == data.name_ && roll_ == data.roll_;
 }

 private:
 std::string name_;
 int roll_;
};

सदस्य सी++ में कार्य करता है

उन भाषाओं के लिए बड़े कौशल सेट होते है और कोड का लाभ उठाने के लिए कुछ प्रक्रियात्मक भाषाओं को वस्तु-उन्मुख क्षमताओं के साथ विस्तारित किया गया है। संभवतः सबसे प्रसिद्ध उदाहरण सी++ है, जो सी प्रोग्रामिंग भाषा का ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन है। किसी उपस्थित प्रक्रियात्मक भाषा में वस्तु-उन्मुख प्रतिमान को जोड़ने के लिए डिज़ाइन की आवश्यकताओं के कारण, सी++ में पास होने वाले संदेश में कुछ अनूठी क्षमताएं और शब्दावलियां होती है। उदाहरण के लिए, सी++ में एक विधि को मेंबर फंक्शन के रूप में जाना जाता है। सी++ में आभासी कार्यों की अवधारणा भी है जो सदस्य कार्य है जिन्हें व्युत्पन्न वर्गों में ओवरराइड किया जाता है और गतिशील प्रेषण की अनुमति देता है।

आभासी कार्य

वर्चुअल फ़ंक्शंस वे साधन है जिनके द्वारा सी++ वर्ग बहुरूपी व्यवहार प्राप्त करते है। गैर-आभासी सदस्य कार्य, या नियमित विधियाँ, वे है जो बहुरूपता (कंप्यूटर विज्ञान) में भाग नहीं लेते है।

सी++ उदाहरण:

#include <iostream>
#include <memory>

class Super {
 public:
 virtual ~Super() = default;

 virtual void IAm() { std::cout << "I'm the super class!\n"; }
};

class Sub : public Super {
 public:
 void IAm() override { std::cout << "I'm the subclass!\n"; }
};

int main() {
 std::unique_ptr<Super> inst1 = std::make_unique<Super>();
 std::unique_ptr<Super> inst2 = std::make_unique<Sub>();

 inst1->IAm(); // Calls |Super::IAm|.
 inst2->IAm(); // Calls |Sub::IAm|.
}

यह भी देखें

  • गुण (प्रोग्रामिंग)
  • दूरस्थ विधि मंगलाचरण
  • उपनेमका, जिसे उपप्रोग्राम, दिनचर्या, प्रक्रिया या कार्य भी कहा जाता है

टिप्पणियाँ

  1. "What is an Object?". oracle.com. Oracle Corporation. Retrieved 13 December 2013.
  2. 2.0 2.1 Martin, Robert C. (2009). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. p. 296. ISBN 978-0-13-235088-4.
  3. Meyer, Bertrand (1988). Object-Oriented Software Construction. Cambridge: Prentice Hall International Series in Computer Science. pp. 52–54. ISBN 0-13-629049-3.
  4. "Abstract Methods and Classes". oracle.com. Oracle Java Documentation. Retrieved 11 December 2014.


संदर्भ