विधि (कंप्यूटर प्रोग्रामिंग): Difference between revisions
No edit summary |
No edit summary |
||
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}} | ||
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) में एक '''विधि''' एक [[संदेश देना|संदेश]] और एक वस्तु से जुड़ी एक [[प्रक्रिया (कंप्यूटर विज्ञान)|प्रक्रिया]] है। एक वस्तु में ''राज्य डेटा'' और व्यवहार होते | [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) में एक '''विधि''' एक [[संदेश देना|संदेश]] और एक वस्तु से जुड़ी एक [[प्रक्रिया (कंप्यूटर विज्ञान)|प्रक्रिया]] है। एक वस्तु में ''राज्य डेटा'' और व्यवहार होते है, ये एक इंटरफ़ेस बनाते है, जो निर्दिष्ट करता है कि वस्तु का उपयोग इसके विभिन्न उपभोक्ताओं द्वारा किया जा सकता है। एक विधि उपभोक्ता द्वारा पैरामीट्रिज्ड ऑब्जेक्ट का व्यवहार है। | ||
डेटा को वस्तु की [[संपत्ति (प्रोग्रामिंग)]] के रूप में दर्शाया जाता है, और व्यवहार को विधियों के रूप में दर्शाया जाता है। उदाहरण के लिए, एक <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>, आदि है। | ||
विधियाँ इंटरफ़ेस भी प्रदान करती | विधियाँ इंटरफ़ेस भी प्रदान करती है जिसका उपयोग अन्य वर्ग किसी वस्तु के गुणों तक पहुँचने और संशोधित करने के लिए करते है, इसे एनकैप्सुलेशन के रूप में जाना जाता है। एनकैप्सुलेशन और ओवरराइडिंग विधियों और प्रक्रिया कॉल के बीच दो प्राथमिक विशिष्ट विशेषताएं है।<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>, आदि पर परिभाषित एक विधि हो सकती है, प्रत्येक अपने क्षेत्र की गणना करने के लिए उपयुक्त सूत्र को परिभाषित करेगा। विचार यह है कि वस्तुओं को "ब्लैक बॉक्स" के रूप में देखा जाए ताकि वस्तु के आंतरिक भाग में परिवर्तन का उपयोग करने वाली अन्य वस्तुओं पर कम से कम प्रभाव डाला जा सके। इसे एनकैप्सुलेशन के रूप में जाना जाता है और इसका उद्देश्य कोड को बनाए रखना और पुन: उपयोग करना आसान बनाना है। | ||
दूसरी ओर, मेथड ओवरलोडिंग, विधि के मापदंडों के आधार पर एक संदेश को संभालने के लिए उपयोग किए जाने वाले कोड को अलग करने के लिए संदर्भित करता है। यदि कोई प्राप्त वस्तु को किसी भी विधि में पहले पैरामीटर के रूप में देखता है तो ओवरराइडिंग ओवरलोडिंग का एक विशेष मामला है जहां चयन केवल पहले तर्क पर आधारित होता है। निम्न सरल जावा उदाहरण अंतर दिखाता है: | दूसरी ओर, मेथड ओवरलोडिंग, विधि के मापदंडों के आधार पर एक संदेश को संभालने के लिए उपयोग किए जाने वाले कोड को अलग करने के लिए संदर्भित करता है। यदि कोई प्राप्त वस्तु को किसी भी विधि में पहले पैरामीटर के रूप में देखता है तो ओवरराइडिंग ओवरलोडिंग का एक विशेष मामला है जहां चयन केवल पहले तर्क पर आधारित होता है। निम्न सरल जावा उदाहरण अंतर दिखाता है: | ||
Line 15: | Line 15: | ||
किसी वस्तु के डेटा मान को पढ़ने के लिए [[एक्सेसर विधि]]यों का उपयोग किया जाता है। किसी वस्तु के डेटा को संशोधित करने के लिए Mutator विधियों का उपयोग किया जाता है। प्रबंधक विधियों का उपयोग किसी वर्ग की वस्तुओं को प्रारंभ करने और नष्ट करने के लिए किया जाता है। उदाहरण के लिए, निर्माणकर्ता और विध्वंसक। | किसी वस्तु के डेटा मान को पढ़ने के लिए [[एक्सेसर विधि]]यों का उपयोग किया जाता है। किसी वस्तु के डेटा को संशोधित करने के लिए Mutator विधियों का उपयोग किया जाता है। प्रबंधक विधियों का उपयोग किसी वर्ग की वस्तुओं को प्रारंभ करने और नष्ट करने के लिए किया जाता है। उदाहरण के लिए, निर्माणकर्ता और विध्वंसक। | ||
ये विधियाँ एक [[अमूर्त परत]] प्रदान करती | ये विधियाँ एक [[अमूर्त परत]] प्रदान करती है जो [[एनकैप्सुलेशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|इनकैप्सुलेशन]] और [[प्रतिरूपकता (प्रोग्रामिंग)|प्रतिरूपकता]] की सुविधा प्रदान करती है। उदाहरण के लिए, यदि एक बैंक-खाता वर्ग वर्तमान शेष राशि को पुनः प्राप्त करने के लिए एक <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; | |||
} | |||
} | |||
} | |||
=== विध्वंसक === | === विध्वंसक === | ||
Line 35: | Line 32: | ||
==== फ़ाइनलाइज़र ==== | ==== फ़ाइनलाइज़र ==== | ||
[[कचरा संग्रह (कंप्यूटर विज्ञान)|कचरा]] एकत्रित करने वाली भाषाओं में, जैसे कि जावा, सी शार्प, और [[पायथन (प्रोग्रामिंग भाषा)|पायथन]], विध्वंसक को फाइनलाइज़र के रूप में जाना जाता है। उनके पास विनाशकों के लिए एक समान उद्देश्य और कार्य है, लेकिन उन भाषाओं के बीच अंतर के कारण जो कचरा-संग्रह और मैन्युअल स्मृति प्रबंधन वाली भाषाओं का उपयोग करते | [[कचरा संग्रह (कंप्यूटर विज्ञान)|कचरा]] एकत्रित करने वाली भाषाओं में, जैसे कि जावा, सी शार्प, और [[पायथन (प्रोग्रामिंग भाषा)|पायथन]], विध्वंसक को फाइनलाइज़र के रूप में जाना जाता है। उनके पास विनाशकों के लिए एक समान उद्देश्य और कार्य है, लेकिन उन भाषाओं के बीच अंतर के कारण जो कचरा-संग्रह और मैन्युअल स्मृति प्रबंधन वाली भाषाओं का उपयोग करते है, जिस क्रम में उन्हें बुलाया जाता है वह अलग है। | ||
== सार तरीके == | == सार तरीके == | ||
Line 41: | Line 38: | ||
=== उदाहरण === | === उदाहरण === | ||
निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है: | निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है: | ||
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 IB : IA | |||
} | { | ||
public override abstract void M(); // allowed | |||
{ | } | ||
} | |||
इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।) | इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।) | ||
interface IA | |||
{ | |||
void M() { } | |||
{ | } | ||
interface IB : IA | |||
} | { | ||
abstract void IA.M(); | |||
{ | } | ||
class C : IB { } // error: class 'C' does not implement 'IA.M'. | |||
} | |||
== कक्षा के तरीके == | == कक्षा के तरीके == | ||
क्लास मेथड्स वे मेथड्स | क्लास मेथड्स वे मेथड्स है जिन्हें इंस्टेंस के बजाय क्लास पर कॉल किया जाता है। वे आम तौर पर ऑब्जेक्ट [[मेटा मॉडल]] के हिस्से के रूप में उपयोग किए जाते है। यानी, प्रत्येक वर्ग के लिए, मेटा-मॉडल में क्लास ऑब्जेक्ट का एक उदाहरण परिभाषित किया गया है। मेटा-मॉडल प्रोटोकॉल कक्षाओं को बनाने और हटाने की अनुमति देते है। इस अर्थ में, वे ऊपर वर्णित कंस्ट्रक्टर्स और डिस्ट्रक्टर्स के समान कार्यक्षमता प्रदान करते है। लेकिन कुछ भाषाओं जैसे [[कॉमन लिस्प ऑब्जेक्ट सिस्टम]] (सीएलओएस) में मेटा-मॉडल डेवलपर को रन टाइम पर ऑब्जेक्ट मॉडल को गतिशील रूप से बदलने की अनुमति देता है: उदाहरण के लिए, नई कक्षाएं बनाने के लिए, वर्ग पदानुक्रम को फिर से परिभाषित करना, गुणों को संशोधित करना आदि। | ||
== विशेष तरीके == | == विशेष तरीके == | ||
विशेष विधियाँ बहुत भाषा-विशिष्ट | विशेष विधियाँ बहुत भाषा-विशिष्ट है और एक भाषा यहाँ परिभाषित किसी भी, कुछ या सभी विशेष विधियों का समर्थन नहीं कर सकती है। एक भाषा का संकलक स्वचालित रूप से डिफ़ॉल्ट विशेष विधियों को उत्पन्न कर सकता है या एक प्रोग्रामर को विशेष विधियों को वैकल्पिक रूप से परिभाषित करने की अनुमति दी जा सकती है। अधिकांश विशेष विधियों को सीधे नहीं बुलाया जा सकता है, बल्कि संकलक उन्हें उचित समय पर कॉल करने के लिए कोड उत्पन्न करता है। | ||
=== स्थैतिक तरीके === | === स्थैतिक तरीके === | ||
स्थैतिक विधियाँ किसी विशिष्ट उदाहरण के बजाय किसी वर्ग के सभी उदाहरणों के लिए प्रासंगिक होती | स्थैतिक विधियाँ किसी विशिष्ट उदाहरण के बजाय किसी वर्ग के सभी उदाहरणों के लिए प्रासंगिक होती है। वे उस अर्थ में [[स्थैतिक चर]] के समान है। एक उदाहरण एक वर्ग के प्रत्येक उदाहरण के सभी चर के मानों को योग करने के लिए एक स्थिर विधि होगी। उदाहरण के लिए, यदि कोई <code>Product</code> वर्ग होता तो उसके पास सभी उत्पादों की औसत कीमत की गणना करने के लिए एक स्थिर विधि हो सकती थी। | ||
जावा में, आमतौर पर इस्तेमाल की जाने वाली स्थैतिक विधि है: | जावा में, आमतौर पर इस्तेमाल की जाने वाली स्थैतिक विधि है: | ||
Math.max ( | Math.max(double a, double b) | ||
इस स्थैतिक विधि का कोई स्वामित्व नहीं है और यह किसी उदाहरण पर नहीं चलता है। यह अपने तर्कों से सारी जानकारी प्राप्त करता है।<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 ++ वर्ग बहुरूपी व्यवहार प्राप्त कर सकता है। गैर-आभासी सदस्य कार्य, या नियमित तरीके, वे है जो [[बहुरूपता (कंप्यूटर विज्ञान)]] में भाग नहीं लेते है। | ||
सी++ उदाहरण: | सी++ उदाहरण: | ||
#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<nowiki><Sub>();</nowiki> | |||
inst1->IAm(); // Calls |Super::IAm|. | |||
inst2->IAm(); // Calls |Sub::IAm|. | |||
} | |||
} | |||
== यह भी देखें == | == यह भी देखें == |
Revision as of 04:25, 11 March 2023
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी) में एक विधि एक संदेश और एक वस्तु से जुड़ी एक प्रक्रिया है। एक वस्तु में राज्य डेटा और व्यवहार होते है, ये एक इंटरफ़ेस बनाते है, जो निर्दिष्ट करता है कि वस्तु का उपयोग इसके विभिन्न उपभोक्ताओं द्वारा किया जा सकता है। एक विधि उपभोक्ता द्वारा पैरामीट्रिज्ड ऑब्जेक्ट का व्यवहार है।
डेटा को वस्तु की संपत्ति (प्रोग्रामिंग) के रूप में दर्शाया जाता है, और व्यवहार को विधियों के रूप में दर्शाया जाता है। उदाहरण के लिए, एक Window
ऑब्जेक्ट में open
और close
जैसे तरीके हो सकते है, जबकि इसकी स्थिति (चाहे वह किसी भी समय खुली या बंद हो) एक संपत्ति होगी।
क्लास-आधारित प्रोग्रामिंग में, विधियों को एक वर्ग के भीतर परिभाषित किया जाता है, और ऑब्जेक्ट किसी दिए गए वर्ग के उदाहरण (कंप्यूटर विज्ञान) होते है। विधि द्वारा प्रदान की जाने वाली सबसे महत्वपूर्ण क्षमताओं में से एक विधि ओवरराइडिंग है - एक ही नाम (जैसे, क्षेत्र) का उपयोग कई अलग-अलग प्रकार की कक्षाओं के लिए किया जा सकता है। यह भेजने वाली वस्तुओं को व्यवहारों को लागू करने और उन व्यवहारों के कार्यान्वयन को प्राप्त करने वाली वस्तु को सौंपने की अनुमति देता है। जावा प्रोग्रामिंग में एक विधि क्लास ऑब्जेक्ट के व्यवहार को सेट करती है। उदाहरण के लिए, एक वस्तु किसी अन्य वस्तु को एक क्षेत्र संदेश भेज सकती है और उपयुक्त सूत्र लागू किया जाता है कि क्या प्राप्त वस्तु एक rectangle
, circle
, triangle
, आदि है।
विधियाँ इंटरफ़ेस भी प्रदान करती है जिसका उपयोग अन्य वर्ग किसी वस्तु के गुणों तक पहुँचने और संशोधित करने के लिए करते है, इसे एनकैप्सुलेशन के रूप में जाना जाता है। एनकैप्सुलेशन और ओवरराइडिंग विधियों और प्रक्रिया कॉल के बीच दो प्राथमिक विशिष्ट विशेषताएं है।[1]
ओवरराइडिंग और ओवरलोडिंग
मेथड ओवरराइडिंग और ओवरलोडिंग दो सबसे महत्वपूर्ण तरीके है जो एक पारंपरिक प्रक्रिया या फ़ंक्शन कॉल से भिन्न होते है। ओवरराइडिंग अपने सुपरक्लास की एक विधि के कार्यान्वयन को फिर से परिभाषित करने वाले उपवर्ग को संदर्भित करता है। उदाहरण के लिए, findArea
एक आकृति वर्ग,[2] triangle
, आदि पर परिभाषित एक विधि हो सकती है, प्रत्येक अपने क्षेत्र की गणना करने के लिए उपयुक्त सूत्र को परिभाषित करेगा। विचार यह है कि वस्तुओं को "ब्लैक बॉक्स" के रूप में देखा जाए ताकि वस्तु के आंतरिक भाग में परिवर्तन का उपयोग करने वाली अन्य वस्तुओं पर कम से कम प्रभाव डाला जा सके। इसे एनकैप्सुलेशन के रूप में जाना जाता है और इसका उद्देश्य कोड को बनाए रखना और पुन: उपयोग करना आसान बनाना है।
दूसरी ओर, मेथड ओवरलोडिंग, विधि के मापदंडों के आधार पर एक संदेश को संभालने के लिए उपयोग किए जाने वाले कोड को अलग करने के लिए संदर्भित करता है। यदि कोई प्राप्त वस्तु को किसी भी विधि में पहले पैरामीटर के रूप में देखता है तो ओवरराइडिंग ओवरलोडिंग का एक विशेष मामला है जहां चयन केवल पहले तर्क पर आधारित होता है। निम्न सरल जावा उदाहरण अंतर दिखाता है:
एक्सेसर, म्यूटेटर और मैनेजर तरीके
किसी वस्तु के डेटा मान को पढ़ने के लिए एक्सेसर विधियों का उपयोग किया जाता है। किसी वस्तु के डेटा को संशोधित करने के लिए Mutator विधियों का उपयोग किया जाता है। प्रबंधक विधियों का उपयोग किसी वर्ग की वस्तुओं को प्रारंभ करने और नष्ट करने के लिए किया जाता है। उदाहरण के लिए, निर्माणकर्ता और विध्वंसक।
ये विधियाँ एक अमूर्त परत प्रदान करती है जो इनकैप्सुलेशन और प्रतिरूपकता की सुविधा प्रदान करती है। उदाहरण के लिए, यदि एक बैंक-खाता वर्ग वर्तमान शेष राशि को पुनः प्राप्त करने के लिए एक 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 IB : IA { public override abstract void M(); // allowed }
इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)
interface IA { void M() { } } interface IB : 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_; };
सदस्य सी++ में कार्य करता है
उन भाषाओं के लिए बड़े कौशल सेट और विरासत कोड का लाभ उठाने के लिए कुछ प्रक्रियात्मक भाषाओं को वस्तु-उन्मुख क्षमताओं के साथ विस्तारित किया गया था, लेकिन फिर भी वस्तु-उन्मुख विकास के लाभ प्रदान करते है। शायद सबसे प्रसिद्ध उदाहरण सी++ है, जो सी प्रोग्रामिंग भाषा का ऑब्जेक्ट-ओरिएंटेड एक्सटेंशन है। किसी मौजूदा प्रक्रियात्मक भाषा में वस्तु-उन्मुख प्रतिमान को जोड़ने के लिए डिज़ाइन की आवश्यकताओं के कारण, सी++ में पास होने वाले संदेश में कुछ अनूठी क्षमताएं और शब्दावलियां है। उदाहरण के लिए, सी++ में एक मेथड को मेंबर फंक्शन के रूप में जाना जाता है। सी++ में आभासी कार्यों की अवधारणा भी है जो सदस्य कार्य है जिन्हें व्युत्पन्न कक्षाओं में ओवरराइड किया जा सकता है और गतिशील प्रेषण की अनुमति देता है।
आभासी कार्य
वर्चुअल फ़ंक्शंस वे साधन है जिनके द्वारा C ++ वर्ग बहुरूपी व्यवहार प्राप्त कर सकता है। गैर-आभासी सदस्य कार्य, या नियमित तरीके, वे है जो बहुरूपता (कंप्यूटर विज्ञान) में भाग नहीं लेते है।
सी++ उदाहरण:
#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|. }
यह भी देखें
- संपत्ति (प्रोग्रामिंग)
- दूरस्थ विधि मंगलाचरण
- उपनेमका, जिसे उपप्रोग्राम, दिनचर्या, प्रक्रिया या कार्य भी कहा जाता है
टिप्पणियाँ
- ↑ "What is an Object?". oracle.com. Oracle Corporation. Retrieved 13 December 2013.
- ↑ 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.
- ↑ Meyer, Bertrand (1988). Object-Oriented Software Construction. Cambridge: Prentice Hall International Series in Computer Science. pp. 52–54. ISBN 0-13-629049-3.
- ↑ "Abstract Methods and Classes". oracle.com. Oracle Java Documentation. Retrieved 11 December 2014.
संदर्भ
- JANA, DEBASISH (1 January 2005). C++ AND OBJECT-ORIENTED PROGRAMMING PARADIGM. PHI Learning Pvt. Ltd. ISBN 978-81-203-2871-6.
- Sengupta, Probal (1 August 2004). Object-Oriented Programming: Fundamentals And Applications. PHI Learning Pvt. Ltd. ISBN 978-81-203-1258-6.
- Svenk, Goran (2003). Object-oriented Programming: Using C++ for Engineering and Technology. Cengage Learning. ISBN 0-7668-3894-3.
- Balagurusamy (2013). Object Oriented Programming with C++. Tata McGraw-Hill Education. ISBN 978-1-259-02993-6.
- Kirch-Prinz, Ulla; Prinz, Peter (2002). A Complete Guide to Programming in C++. Jones & Bartlett Learning. ISBN 978-0-7637-1817-6.
- Conger, David (2006). Creating Games in C++: A Step-by-step Guide. New Riders. ISBN 978-0-7357-1434-2.
- Skinner, M. T. (1992). The Advanced C++ Book. Silicon Press. ISBN 978-0-929306-10-0.
- Love (1 September 2005). Linux Kernel Development. Pearson Education. ISBN 978-81-7758-910-8.
- DEHURI, SATCHIDANANDA; JAGADEV, ALOK KUMAR; RATH, AMIYA KUMAR (8 May 2007). OBJECT-ORIENTED PROGRAMMING USING C++. PHI Learning Pvt. Ltd. ISBN 978-81-203-3085-6.