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

From Vigyanwiki
(Created page with "{{Short description|Definition in programming that specifies how an object works}} ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग...")
 
No edit summary
Line 1: Line 1:
{{Short description|Definition in programming that specifies how an object works}}
{{Short description|Definition in programming that specifies how an object works}}
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, क्लास [[ऑब्जेक्ट (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] बनाने के लिए एक एक्स्टेंसिबल प्रोग्राम-कोड-टेम्प्लेट है, राज्य ([[सदस्य चर]]) के लिए प्रारंभिक मान प्रदान करता है और व्यवहार के कार्यान्वयन (सदस्य कार्य या [[विधि (कंप्यूटर प्रोग्रामिंग)]]) .{{sfn|Gamma|Helm|Johnson|Vlissides|1995|p=14}}{{sfn|Bruce|2002|loc=2.1 Objects, classes, and object types, {{Google books|9NGWq3K1RwUC|Objects, classes, and object types|page=18|plainurl=yes}}}} कई भाषाओं में, वर्ग का नाम वर्ग के नाम (स्वयं टेम्पलेट) के रूप में प्रयोग किया जाता है, वर्ग के डिफ़ॉल्ट [[कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] के लिए नाम (एक [[सबरूटीन]] जो ऑब्जेक्ट बनाता है), और [[डेटा प्रकार]] के रूप में इंस्टेंस (कंप्यूटर विज्ञान) द्वारा उत्पन्न वस्तुओं की कक्षा; इन विशिष्ट अवधारणाओं को आसानी से सम्मिश्रित किया जाता है।{{sfn|Bruce|2002|loc=2.1 Objects, classes, and object types, {{Google books|9NGWq3K1RwUC|Objects, classes, and object types|page=18|plainurl=yes}}}} हालांकि, सम्मिश्रण के बिंदु पर, कोई तर्क दे सकता है कि इसकी बहुरूपी प्रकृति के कारण एक भाषा में निहित एक विशेषता है और क्यों ये भाषाएं इतनी शक्तिशाली, गतिशील और उपयोग के लिए अनुकूलनीय हैं, जो बिना बहुरूपता वाली भाषाओं की तुलना में मौजूद हैं। इस प्रकार वे डायनेमिक सिस्टम (यानी वास्तविक दुनिया, मशीन लर्निंग, एआई) को अधिक आसानी से मॉडल कर सकते हैं।
[[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग|वस्तु-उन्मुख प्रोग्रामिंग]] में, क्लास [[ऑब्जेक्ट (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|ऑब्जेक्ट (वस्तु-उन्मुख प्रोग्रामिंग)]] बनाने के लिए एक एक्स्टेंसिबल प्रोग्राम-कोड-टेम्प्लेट है, स्थिति ([[सदस्य चर|सदस्य वेरीएबल]]) के लिए प्रारंभिक मान प्रदान करता है और व्यवहार के कार्यान्वयन (सदस्य कार्य या [[विधि (कंप्यूटर प्रोग्रामिंग)]]) .{{sfn|Gamma|Helm|Johnson|Vlissides|1995|p=14}}{{sfn|Bruce|2002|loc=2.1 Objects, classes, and object types, {{Google books|9NGWq3K1RwUC|Objects, classes, and object types|page=18|plainurl=yes}}}} कई भाषाओं में, क्लास का नाम क्लास के नाम (स्वयं टेम्पलेट) के रूप में प्रयोग किया जाता है, क्लास के डिफ़ॉल्ट [[कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|कंस्ट्रक्टर (वस्तु-उन्मुख प्रोग्रामिंग)]] के लिए नाम (एक [[सबरूटीन]] जो ऑब्जेक्ट बनाता है), और [[डेटा प्रकार]] के रूप में इंस्टेंस (कंप्यूटर विज्ञान) द्वारा उत्पन्न वस्तुओं की कक्षा; इन विशिष्ट अवधारणाओं को आसानी से सम्मिश्रित किया जाता है।{{sfn|Bruce|2002|loc=2.1 Objects, classes, and object types, {{Google books|9NGWq3K1RwUC|Objects, classes, and object types|page=18|plainurl=yes}}}} हालांकि, सम्मिश्रण के बिंदु पर, कोई तर्क दे सकता है कि इसकी बहुरूपी प्रकृति के कारण एक भाषा में निहित एक विशेषता है और क्यों ये भाषाएं इतनी शक्तिशाली, गतिशील और उपयोग के लिए अनुकूलनीय हैं, जो बिना बहुरूपता वाली भाषाओं की तुलना में सम्मिलित हैं। इस प्रकार वे डायनेमिक सिस्टम (यानी वास्तविक दुनिया, मशीन लर्निंग, एआई) को अधिक आसानी से मॉडल कर सकते हैं।


जब क्लास के कंस्ट्रक्टर द्वारा कोई ऑब्जेक्ट बनाया जाता है, तो परिणामी ऑब्जेक्ट को क्लास का एक इंस्टेंस (कंप्यूटर साइंस) कहा जाता है, और ऑब्जेक्ट के लिए विशिष्ट सदस्य चर को [[उदाहरण चर]] कहा जाता है, क्लास भर में साझा किए गए [[वर्ग चर]]्स के विपरीत .
जब क्लास के कंस्ट्रक्टर द्वारा कोई ऑब्जेक्ट बनाया जाता है, तो परिणामी ऑब्जेक्ट को क्लास का एक इंस्टेंस (कंप्यूटर विज्ञान) कहा जाता है, और ऑब्जेक्ट के लिए विशिष्ट सदस्य वेरीएबल को [[उदाहरण चर|उदाहरण वेरीएबल]] कहा जाता है, क्लास भर में साझा किए गए क्लास [[वर्ग चर|वेरीएबल]]्स के विपरीत .


कुछ भाषाओं में, कक्षाएं, वास्तव में, केवल एक संकलन-समय की विशेषता हैं (रन-टाइम पर नई कक्षाएं घोषित नहीं की जा सकती हैं), जबकि अन्य भाषाओं में कक्षाएं प्रथम श्रेणी के नागरिक हैं, और आम तौर पर स्वयं ऑब्जेक्ट हैं (आमतौर पर प्रकार {{Mono|Class}} या इसी के समान)। इन भाषाओं में, एक वर्ग जो अपने भीतर कक्षाएं बनाता है उसे [[मेटाक्लास]] कहा जाता है।
कुछ भाषाओं में, क्लासेस, वास्तव में, केवल एक संकलन-समय की विशेषता हैं (रन-टाइम पर नई क्लासेस घोषित नहीं की जा सकती हैं), जबकि अन्य भाषाओं में क्लासेस प्रथम श्रेणी के नागरिक हैं, और सामान्य रूप से स्वयं ऑब्जेक्ट हैं (सामान्य रूप से प्रकार {{Mono|Class}} या इसी के समान)। इन भाषाओं में, एक क्लास जो अपने अंदरक्लासेस बनाता है उसे [[मेटाक्लास]] कहा जाता है।


== कक्षा बनाम प्रकार ==
== कक्षा बनाम प्रकार ==
इसके सबसे आकस्मिक उपयोग में, लोग अक्सर किसी वस्तु के वर्ग को संदर्भित करते हैं, लेकिन संकीर्ण रूप से बोलने वाली वस्तुओं का प्रकार होता है: इंटरफ़ेस, अर्थात् सदस्य चर के प्रकार, सदस्य कार्यों (विधियों) के हस्ताक्षर, और ये गुण संतुष्ट करते हैं। उसी समय, एक वर्ग का कार्यान्वयन (विशेष रूप से विधियों का कार्यान्वयन) होता है, और किसी दिए गए कार्यान्वयन के साथ दिए गए प्रकार की वस्तुओं को बना सकता है।{{sfn|Gamma|Helm|Johnson|Vlissides|1995|p=17}} प्रकार सिद्धांत के संदर्भ में, एक वर्ग एक कार्यान्वयन है{{mdashb}}एक ठोस [[डेटा संरचना]] और सबरूटीन्स का संग्रह{{mdashb}}जबकि एक प्रकार एक [[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] है। विभिन्न (ठोस) वर्ग समान (सार) प्रकार की वस्तुओं का उत्पादन कर सकते हैं (प्रकार प्रणाली के आधार पर); उदाहरण के लिए, प्रकार {{Mono|Stack}} दो वर्गों के साथ लागू किया जा सकता है{{snd}} {{Mono|SmallStack}} (छोटे ढेर के लिए तेजी से, लेकिन खराब पैमाने पर) और {{Mono|ScalableStack}} (छोटे ढेर के लिए अच्छी तरह से लेकिन उच्च ओवरहेड)। इसी तरह, एक क्लास में कई अलग-अलग कंस्ट्रक्टर हो सकते हैं।
इसके सबसे आकस्मिक उपयोग में, लोग प्रायः किसी वस्तु के क्लास को संदर्भित करते हैं, लेकिन संकीर्ण रूप से बोलने वाली वस्तुओं का प्रकार होता है: इंटरफ़ेस, अर्थात् सदस्य वेरीएबल के प्रकार, सदस्य कार्यों (विधियों) के हस्ताक्षर, और ये गुण संतुष्ट करते हैं। उसी समय, एक क्लास का कार्यान्वयन (विशेष रूप से विधियों का कार्यान्वयन) होता है, और किसी दिए गए कार्यान्वयन के साथ दिए गए प्रकार की वस्तुओं को बना सकता है।{{sfn|Gamma|Helm|Johnson|Vlissides|1995|p=17}} प्रकार सिद्धांत के संदर्भ में, एक क्लास एक कार्यान्वयन है{{mdashb}}एक ठोस [[डेटा संरचना]] और सबरूटीन्स का संग्रह{{mdashb}}जबकि एक प्रकार एक [[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग)]] है। विभिन्न (ठोस) क्लास समान (सार) प्रकार की वस्तुओं का उत्पादन कर सकते हैं (प्रकार प्रणाली के आधार पर); उदाहरण के लिए, प्रकार {{Mono|Stack}} दो क्लासों के साथ प्रयुक्त किया जा सकता है{{snd}} {{Mono|SmallStack}} (छोटे ढेर के लिए तेजी से, लेकिन खराब पैमाने पर) और {{Mono|ScalableStack}} (छोटे ढेर के लिए अच्छी तरह से लेकिन उच्च ओवरहेड)। इसी तरह, एक क्लास में कई अलग-अलग कंस्ट्रक्टर हो सकते हैं।


वर्ग प्रकार आम तौर पर संज्ञाओं का प्रतिनिधित्व करते हैं, जैसे कि एक व्यक्ति, स्थान या चीज़, या कुछ [[नाममात्र]]ीकरण, और एक वर्ग इनके कार्यान्वयन का प्रतिनिधित्व करता है। उदाहरण के लिए, ए {{Mono|Banana}} प्रकार सामान्य रूप से केले के गुणों और कार्यक्षमता का प्रतिनिधित्व कर सकता है, जबकि {{Mono|ABCBanana}} और {{Mono|XYZBanana}} कक्षाएं केले के उत्पादन के तरीकों का प्रतिनिधित्व करेंगी (जैसे, केले के आपूर्तिकर्ता या डेटा संरचनाएं और एक वीडियो गेम में केले का प्रतिनिधित्व करने और आकर्षित करने के लिए कार्य)। {{Mono|ABCBanana}} }} वर्ग तब विशेष केले का उत्पादन कर सकता है: के उदाहरण {{Mono|ABCBanana}} वर्ग प्रकार की वस्तुएं होंगी {{Mono|Banana}}. अक्सर एक प्रकार का केवल एक कार्यान्वयन दिया जाता है, इस मामले में वर्ग का नाम अक्सर प्रकार के नाम के समान होता है।
क्लास प्रकार सामान्य रूप से संज्ञाओं का प्रतिनिधित्व करते हैं, जैसे कि एक व्यक्ति, स्थान या चीज़, या कुछ [[नाममात्र]]ीकरण, और एक क्लास इनके कार्यान्वयन का प्रतिनिधित्व करता है। उदाहरण के लिए, ए {{Mono|Banana}} प्रकार सामान्य रूप से केले के गुणों और कार्यक्षमता का प्रतिनिधित्व कर सकता है, जबकि {{Mono|ABCBanana}} और {{Mono|XYZBanana}} क्लासेस केले के उत्पादन के तरीकों का प्रतिनिधित्व करेंगी (जैसे, केले के आपूर्तिकर्ता या डेटा संरचनाएं और एक वीडियो गेम में केले का प्रतिनिधित्व करने और आकर्षित करने के लिए कार्य)। {{Mono|ABCBanana}}<nowiki> }} क्लास तब विशेष केले का उत्पादन कर सकता है: के उदाहरण </nowiki>{{Mono|ABCBanana}} क्लास प्रकार की वस्तुएं होंगी {{Mono|Banana}}. प्रायः एक प्रकार का केवल एक कार्यान्वयन दिया जाता है, इस स्थिति  में क्लास का नाम प्रायः प्रकार के नाम के समान होता है।


== डिजाइन और कार्यान्वयन ==
== डिजाइन और कार्यान्वयन ==
कक्षाएं संरचनात्मक और व्यवहारिक घटकों से बनी हैं।{{sfn|Gamma|Helm|Johnson|Vlissides|1995|p=14}} <!-- though there may not be a requirement to include any constituents at all--> प्रोग्रामिंग लैंग्वेज जिसमें प्रोग्रामिंग कंस्ट्रक्शन के रूप में कक्षाएं शामिल हैं, विभिन्न क्लास-संबंधित सुविधाओं के लिए समर्थन प्रदान करती हैं, और इन सुविधाओं का उपयोग करने के लिए आवश्यक सिंटैक्स एक प्रोग्रामिंग भाषा से दूसरे में बहुत भिन्न होता है।
क्लासेस संरचनात्मक और व्यवहारिक घटकों से बनी हैं।{{sfn|Gamma|Helm|Johnson|Vlissides|1995|p=14}} प्रोग्रामिंग भाषा जिसमें प्रोग्रामिंग कंस्ट्रक्शन के रूप में क्लासेस सम्मिलित हैं, विभिन्न क्लास-संबंधित सुविधाओं के लिए समर्थन प्रदान करती हैं, और इन सुविधाओं का उपयोग करने के लिए आवश्यक सिंटैक्स एक प्रोग्रामिंग भाषा से दूसरे में बहुत भिन्न होता है।


=== <स्पैन क्लास = एंकर आईडी = संपत्ति> </span> संरचना ===
=== <स्पैन क्लास = एंकर आईडी = संपत्ति> संरचना ===
[[File:oop-uml-class-example.png|frame|right|कक्षाओं के लिए [[एकीकृत मॉडलिंग भाषा]] अंकन]]एक वर्ग में [[डेटा (कंप्यूटिंग)]] फ़ील्ड (कंप्यूटर_विज्ञान) विवरण (या [[संपत्ति (प्रोग्रामिंग)]], फ़ील्ड (कंप्यूटर विज्ञान), डेटा सदस्य चर, या [[विशेषता (कंप्यूटिंग)]]) शामिल हैं। ये आमतौर पर फ़ील्ड प्रकार और नाम होते हैं जो प्रोग्राम रन टाइम पर स्टेट वेरिएबल्स से जुड़े होंगे; ये राज्य चर या तो वर्ग या वर्ग के विशिष्ट उदाहरणों से संबंधित हैं। अधिकांश भाषाओं में, वर्ग द्वारा परिभाषित संरचना इसके उदाहरणों द्वारा उपयोग की जाने वाली मेमोरी का लेआउट निर्धारित करती है। अन्य कार्यान्वयन संभव हैं: उदाहरण के लिए, पायथन (प्रोग्रामिंग लैंग्वेज) में ऑब्जेक्ट एसोसिएटिव की-वैल्यू कंटेनर का उपयोग करते हैं।<ref name="pythondata model">{{cite web|url=https://docs.python.org/reference/datamodel.html|title=3. Data model|work=The Python Language Reference|publisher=Python Software Foundation|access-date=2012-04-26}}</ref>
[[File:oop-uml-class-example.png|frame|right|क्लासेस के लिए [[एकीकृत मॉडलिंग भाषा]] अंकन]]एक क्लास में [[डेटा (कंप्यूटिंग)]] क्षेत्र (कंप्यूटर_विज्ञान) विवरण (या [[संपत्ति (प्रोग्रामिंग)]], क्षेत्र (कंप्यूटर विज्ञान), डेटा सदस्य वेरीएबल, या [[विशेषता (कंप्यूटिंग)]]) सम्मिलित हैं। ये सामान्य रूप से क्षेत्र प्रकार और नाम होते हैं जो प्रोग्राम रन टाइम पर स्टेट वेरिएबल्स से जुड़े होंगे; ये स्थिति वेरीएबल या तो क्लास या क्लास के विशिष्ट उदाहरणों से संबंधित हैं। अधिकांश भाषाओं में, क्लास द्वारा परिभाषित संरचना इसके उदाहरणों द्वारा उपयोग की जाने वाली मेमोरी का लेआउट निर्धारित करती है। अन्य कार्यान्वयन संभव हैं: उदाहरण के लिए, पायथन (प्रोग्रामिंग भाषा) में ऑब्जेक्ट एसोसिएटिव की-वैल्यू कंटेनर का उपयोग करते हैं।<ref name="pythondata model">{{cite web|url=https://docs.python.org/reference/datamodel.html|title=3. Data model|work=The Python Language Reference|publisher=Python Software Foundation|access-date=2012-04-26}}</ref>
कुछ प्रोग्रामिंग लैंग्वेज जैसे एफिल क्लास की परिभाषा के हिस्से के रूप में [[वर्ग अपरिवर्तनीय]]्स के विनिर्देशन का समर्थन करती है, और उन्हें टाइप सिस्टम के माध्यम से लागू करती है। वर्ग के आक्रमणकारियों को लागू करने में सक्षम होने के लिए राज्य का [[एनकैप्सुलेशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] आवश्यक है।
कुछ प्रोग्रामिंग भाषा जैसे एफिल क्लास की परिभाषा के हिस्से के रूप में क्लास [[वर्ग अपरिवर्तनीय|अपरिवर्तनीय]]्स के विनिर्देशन का समर्थन करती है, और उन्हें टाइप सिस्टम के माध्यम से प्रयुक्त करती है। क्लास के आक्रमणकारियों को प्रयुक्त करने में सक्षम होने के लिए स्थिति का [[एनकैप्सुलेशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|एनकैप्सुलेशन (वस्तु-उन्मुख प्रोग्रामिंग)]] आवश्यक है।


=== व्यवहार ===
=== व्यवहार ===
{{Main|Method (computer programming)}}
{{Main|Method (computer programming)}}
<!-- This section used to contain info on Java interfaces. If you wish to view it (to, say, move to another page), the last revision before the removal of this info is http://en.wikipedia.org/w/index.php?title=Class_(computer_science)&oldid=165562113 -->
<!-- This section used to contain info on Java interfaces. If you wish to view it (to, say, move to another page), the last revision before the removal of this info is http://en.wikipedia.org/w/index.php?title=Class_(computer_science)&oldid=165562113 -->
वर्ग या उसके उदाहरणों के व्यवहार को मेथड (कंप्यूटर प्रोग्रामिंग) का उपयोग करके परिभाषित किया गया है। विधियाँ उपनेमकाएँ हैं जो वस्तुओं या वर्गों पर काम करने की क्षमता रखती हैं। ये ऑपरेशन किसी वस्तु की स्थिति को बदल सकते हैं या इसे एक्सेस करने के तरीके प्रदान कर सकते हैं।{{sfn|Booch|1994|p=86-88}} <!-- (Note: Some languages allow direct access to instance variables ([[C++]])). --> कई प्रकार की विधियाँ मौजूद हैं, लेकिन उनके लिए समर्थन भाषाओं में भिन्न होता है। प्रोग्रामर कोड द्वारा कुछ प्रकार के तरीके बनाए और बुलाए जाते हैं, जबकि अन्य विशेष तरीके - जैसे कि कंस्ट्रक्टर, डिस्ट्रक्टर्स और रूपांतरण ऑपरेटर - कंपाइलर-जेनरेट किए गए कोड द्वारा बनाए और बुलाए जाते हैं। एक भाषा प्रोग्रामर को इन विशेष विधियों को परिभाषित करने और कॉल करने की अनुमति भी दे सकती है।<ref>{{cite web|url=http://www.cplusplus.com/doc/tutorial/classes/|title=Classes (I)|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-04-29}}</ref><ref>{{cite web|url=http://www.cplusplus.com/doc/tutorial/classes2/|title=Classes (II)|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-04-29}}</ref>
क्लास या उसके उदाहरणों के व्यवहार को मेथड (कंप्यूटर प्रोग्रामिंग) का उपयोग करके परिभाषित किया गया है। विधियाँ उपनेमकाएँ हैं जो वस्तुओं या क्लासों पर काम करने की क्षमता रखती हैं। ये ऑपरेशन किसी वस्तु की स्थिति को बदल सकते हैं या इसे एक्सेस करने के तरीके प्रदान कर सकते हैं।{{sfn|Booch|1994|p=86-88}} कई प्रकार की विधियाँ सम्मिलित हैं, लेकिन उनके लिए समर्थन भाषाओं में भिन्न होता है। प्रोग्रामर कोड द्वारा कुछ प्रकार के तरीके बनाए और बुलाए जाते हैं, जबकि अन्य विशेष तरीके - जैसे कि कंस्ट्रक्टर, डिस्ट्रक्टर्स और रूपांतरण ऑपरेटर - कंपाइलर-जेनरेट किए गए कोड द्वारा बनाए और बुलाए जाते हैं। एक भाषा प्रोग्रामर को इन विशेष विधियों को परिभाषित करने और कॉल करने की अनुमति भी दे सकती है।<ref>{{cite web|url=http://www.cplusplus.com/doc/tutorial/classes/|title=Classes (I)|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-04-29}}</ref><ref>{{cite web|url=http://www.cplusplus.com/doc/tutorial/classes2/|title=Classes (II)|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-04-29}}</ref>




=== वर्ग इंटरफ़ेस की अवधारणा ===
=== क्लास इंटरफ़ेस की अवधारणा ===
{{Main|Interface (computing)}}
{{Main|Interface (computing)}}
प्रत्येक वर्ग #संरचना और व्यवहार प्रदान करके एक इंटरफ़ेस लागू करता है (या महसूस करता है)। संरचना में डेटा और राज्य होते हैं, और व्यवहार में कोड होते हैं जो निर्दिष्ट करते हैं कि विधियों को कैसे कार्यान्वित किया जाता है।{{sfn|Booch|1994|p=105}} एक अंतरफलक की परिभाषा और उस अंतरफलक के कार्यान्वयन के बीच अंतर है; हालाँकि, यह रेखा कई प्रोग्रामिंग भाषाओं में धुंधली है क्योंकि वर्ग घोषणाएँ एक इंटरफ़ेस को परिभाषित और कार्यान्वित करती हैं। हालाँकि, कुछ भाषाएँ ऐसी सुविधाएँ प्रदान करती हैं जो इंटरफ़ेस और कार्यान्वयन को अलग करती हैं। उदाहरण के लिए, एक #सार_और_कंक्रीट कार्यान्वयन प्रदान किए बिना एक इंटरफ़ेस को परिभाषित कर सकता है।
प्रत्येक क्लास #संरचना और व्यवहार प्रदान करके एक इंटरफ़ेस प्रयुक्त करता है (या महसूस करता है)। संरचना में डेटा और स्थिति होते हैं, और व्यवहार में कोड होते हैं जो निर्दिष्ट करते हैं कि विधियों को कैसे कार्यान्वित किया जाता है।{{sfn|Booch|1994|p=105}} एक अंतरफलक की परिभाषा और उस अंतरफलक के कार्यान्वयन के बीच अंतर है; हालाँकि, यह रेखा कई प्रोग्रामिंग भाषाओं में धुंधली है क्योंकि क्लास घोषणाएँ एक इंटरफ़ेस को परिभाषित और कार्यान्वित करती हैं। हालाँकि, कुछ भाषाएँ ऐसी सुविधाएँ प्रदान करती हैं जो इंटरफ़ेस और कार्यान्वयन को अलग करती हैं। उदाहरण के लिए, एक #सार_और_कंक्रीट कार्यान्वयन प्रदान किए बिना एक इंटरफ़ेस को परिभाषित कर सकता है।


वर्ग वंशानुक्रम का समर्थन करने वाली भाषाएँ भी कक्षाओं को उन वर्गों से इंटरफेस प्राप्त करने की अनुमति देती हैं जिनसे वे प्राप्त हुए हैं।
क्लास वंशानुक्रम का समर्थन करने वाली भाषाएँ भी क्लासेस को उन क्लासों से इंटरफेस प्राप्त करने की अनुमति देती हैं जिनसे वे प्राप्त हुए हैं।


उदाहरण के लिए, यदि कक्षा ए कक्षा बी से प्राप्त होती है और यदि कक्षा बी इंटरफ़ेस इंटरफ़ेस बी लागू करती है तो कक्षा ए इंटरफ़ेस बी द्वारा प्रदान की गई कार्यक्षमता (स्थिरांक और विधियों की घोषणा) को भी प्राप्त करती है।
उदाहरण के लिए, यदि कक्षा ए कक्षा बी से प्राप्त होती है और यदि कक्षा बी इंटरफ़ेस इंटरफ़ेस बी प्रयुक्त करती है तो कक्षा ए इंटरफ़ेस बी द्वारा प्रदान की गई कार्यक्षमता (स्थिरांक और विधियों की घोषणा) को भी प्राप्त करती है।


उन भाषाओं में जो #जानकारी छिपाने और एनकैप्सुलेशन का समर्थन करती हैं, एक वर्ग के इंटरफ़ेस को वर्ग के सार्वजनिक सदस्यों का सेट माना जाता है, जिसमें विधियाँ और विशेषताएँ दोनों शामिल हैं (अंतर्निहित [[म्यूटेटर विधि]] के माध्यम से); कोई भी निजी सदस्य या आंतरिक डेटा संरचना बाहरी द्वारा निर्भर होने का इरादा नहीं है <!--client--> कोड और इस प्रकार इंटरफ़ेस का हिस्सा नहीं हैं।
उन भाषाओं में जो #जानकारी छिपाने और एनकैप्सुलेशन का समर्थन करती हैं, एक क्लास के इंटरफ़ेस को क्लास के सार्वजनिक सदस्यों का सेट माना जाता है, जिसमें विधियाँ और विशेषताएँ दोनों सम्मिलित हैं (अंतर्निहित [[म्यूटेटर विधि]] के माध्यम से); कोई भी निजी सदस्य या आंतरिक डेटा संरचना बाहरी द्वारा निर्भर होने का इरादा नहीं है <!--client--> कोड और इस प्रकार इंटरफ़ेस का हिस्सा नहीं हैं।


वस्तु-उन्मुख प्रोग्रामिंग पद्धति <!--is designed in such a way--> निर्देश देता है कि किसी वर्ग के किसी भी इंटरफ़ेस का संचालन एक दूसरे से स्वतंत्र होना है। इसका परिणाम एक स्तरित डिज़ाइन में होता है जहाँ एक इंटरफ़ेस के क्लाइंट इंटरफ़ेस में घोषित विधियों का उपयोग करते हैं। एक इंटरफ़ेस क्लाइंट के लिए किसी विशेष क्रम में एक इंटरफ़ेस के संचालन को लागू करने की कोई आवश्यकता नहीं रखता है। इस दृष्टिकोण का लाभ यह है कि क्लाइंट कोड यह मान सकता है कि जब भी क्लाइंट उपयोग के लिए इंटरफ़ेस के संचालन उपलब्ध होते हैं <!--holds a valid reference--> वस्तु तक पहुँच है।<ref>{{Cite book|title=New perspectives computer concepts, 2016. Comprehensive|last=Jamrich|first=Parsons, June|isbn=9781305271616|location=Boston, MA|oclc=917155105|date = 2015-06-22}}</ref> {{Citation needed|reason=Source needed for whole paragraph...this is a rather specific statement about OOP methodology.|date=April 2012}}
वस्तु-उन्मुख प्रोग्रामिंग पद्धति <!--is designed in such a way--> निर्देश देता है कि किसी क्लास के किसी भी इंटरफ़ेस का संचालन एक दूसरे से स्वतंत्र होना है। इसका परिणाम एक स्तरित डिज़ाइन में होता है जहाँ एक इंटरफ़ेस के क्लाइंट इंटरफ़ेस में घोषित विधियों का उपयोग करते हैं। एक इंटरफ़ेस क्लाइंट के लिए किसी विशेष क्रम में एक इंटरफ़ेस के संचालन को प्रयुक्त करने की कोई आवश्यकता नहीं रखता है। इस दृष्टिकोण का लाभ यह है कि क्लाइंट कोड यह मान सकता है कि जब भी क्लाइंट उपयोग के लिए इंटरफ़ेस के संचालन उपलब्ध होते हैं वस्तु तक पहुँच है।<ref>{{Cite book|title=New perspectives computer concepts, 2016. Comprehensive|last=Jamrich|first=Parsons, June|isbn=9781305271616|location=Boston, MA|oclc=917155105|date = 2015-06-22}}</ref> {{Citation needed|reason=Source needed for whole paragraph...this is a rather specific statement about OOP methodology.|date=April 2012}}




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


एक टेलीविज़न सेट में असंख्य विशेषताएं भी होती हैं, जैसे कि आकार और क्या यह रंग का समर्थन करता है, जो एक साथ मिलकर इसकी संरचना बनाते हैं। एक वर्ग एक टेलीविजन के पूर्ण विवरण का प्रतिनिधित्व करता है, जिसमें इसकी विशेषताएँ (संरचना) और बटन (इंटरफ़ेस) शामिल हैं।
एक टेलीविज़न सेट में असंख्य विशेषताएं भी होती हैं, जैसे कि आकार और क्या यह रंग का समर्थन करता है, जो एक साथ मिलकर इसकी संरचना बनाते हैं। एक क्लास एक टेलीविजन के पूर्ण विवरण का प्रतिनिधित्व करता है, जिसमें इसकी विशेषताएँ (संरचना) और बटन (इंटरफ़ेस) सम्मिलित हैं।


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


=== सदस्य पहुंच ===
=== सदस्य पहुंच ===
Line 48: Line 48:
{{Further|Information hiding}}
{{Further|Information hiding}}
निम्नलिखित [[पहुँच विनिर्देशक]] का एक सामान्य सेट है:<ref name="JavaAccessControl">{{cite web| url=http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html|title=Controlling Access to Members of a Class|work=The Java Tutorials|publisher=Oracle|access-date=2012-04-19}}</ref>
निम्नलिखित [[पहुँच विनिर्देशक]] का एक सामान्य सेट है:<ref name="JavaAccessControl">{{cite web| url=http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html|title=Controlling Access to Members of a Class|work=The Java Tutorials|publisher=Oracle|access-date=2012-04-19}}</ref>
* प्राइवेट (या क्लास-प्राइवेट) क्लास तक ही पहुँच को प्रतिबंधित करता है। केवल वही विधियाँ जो एक ही वर्ग का हिस्सा हैं, निजी सदस्यों तक पहुँच सकती हैं।
* प्राइवेट (या क्लास-प्राइवेट) क्लास तक ही पहुँच को प्रतिबंधित करता है। केवल वही विधियाँ जो एक ही क्लास का हिस्सा हैं, निजी सदस्यों तक पहुँच सकती हैं।
* संरक्षित (या वर्ग-संरक्षित) वर्ग को स्वयं और उसके सभी उपवर्गों को सदस्य तक पहुँचने की अनुमति देता है।
* संरक्षित (या क्लास-संरक्षित) क्लास को स्वयं और उसके सभी उपक्लासों को सदस्य तक पहुँचने की अनुमति देता है।
* पब्लिक का मतलब है कि कोई भी कोड सदस्य को उसके नाम से एक्सेस कर सकता है।
* पब्लिक का तात्पर्य है कि कोई भी कोड सदस्य को उसके नाम से एक्सेस कर सकता है।


हालाँकि कई ऑब्जेक्ट-ओरिएंटेड भाषाएँ उपरोक्त एक्सेस स्पेसिफायर का समर्थन करती हैं, <!-- {{Citation needed|reason=This is fairly obvious, but it needs to be cited--could even use a few links even to articles within Wikipedia.|date=April 2012}} -->उनके शब्दार्थ भिन्न हो सकते हैं।
हालाँकि कई वस्तु-उन्मुख भाषाएँ उपरोक्त एक्सेस स्पेसिफायर का समर्थन करती हैं, <!-- {{Citation needed|reason=This is fairly obvious, but it needs to be cited--could even use a few links even to articles within Wikipedia.|date=April 2012}} -->उनके शब्दार्थ भिन्न हो सकते हैं।


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


एक्सेस विनिर्देशक आवश्यक रूप से दृश्यता को नियंत्रित नहीं करते हैं, इसमें निजी सदस्य भी क्लाइंट बाहरी कोड के लिए दृश्यमान हो सकते हैं। कुछ भाषाओं में, एक अप्राप्य लेकिन दृश्यमान सदस्य को रन-टाइम पर संदर्भित किया जा सकता है (उदाहरण के लिए, किसी सदस्य फ़ंक्शन से लौटाए गए सूचक द्वारा), लेकिन क्लाइंट कोड से सदस्य के नाम का संदर्भ देकर इसका उपयोग करने का प्रयास किया जाएगा टाइप चेकर द्वारा रोका गया।<ref>{{cite web|url=https://www.securecoding.cert.org/confluence/display/cplusplus/OOP08-CPP.+Do+not+return+references+to+private+data|title=OOP08-CPP. Do not return references to private data|work=CERT C++ Secure Coding Standard|publisher=Carnegie Mellon University|date=2010-05-10|access-date=2012-05-07|archive-url=https://web.archive.org/web/20151003162754/https://www.securecoding.cert.org/confluence/display/cplusplus/OOP08-CPP.+Do+not+return+references+to+private+data|archive-date=2015-10-03|url-status=dead}}</ref>
एक्सेस विनिर्देशक आवश्यक रूप से दृश्यता को नियंत्रित नहीं करते हैं, इसमें निजी सदस्य भी क्लाइंट बाहरी कोड के लिए दृश्यमान हो सकते हैं। कुछ भाषाओं में, एक अप्राप्य लेकिन दृश्यमान सदस्य को रन-टाइम पर संदर्भित किया जा सकता है (उदाहरण के लिए, किसी सदस्य फ़ंक्शन से लौटाए गए सूचक द्वारा), लेकिन क्लाइंट कोड से सदस्य के नाम का संदर्भ देकर इसका उपयोग करने का प्रयास किया जाएगा टाइप चेकर द्वारा रोका गया।<ref>{{cite web|url=https://www.securecoding.cert.org/confluence/display/cplusplus/OOP08-CPP.+Do+not+return+references+to+private+data|title=OOP08-CPP. Do not return references to private data|work=CERT C++ Secure Coding Standard|publisher=Carnegie Mellon University|date=2010-05-10|access-date=2012-05-07|archive-url=https://web.archive.org/web/20151003162754/https://www.securecoding.cert.org/confluence/display/cplusplus/OOP08-CPP.+Do+not+return+references+to+private+data|archive-date=2015-10-03|url-status=dead}}</ref>
विभिन्न ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज सदस्य की पहुंच और दृश्यता को विभिन्न डिग्री तक लागू करती हैं, और भाषा के प्रकार सिस्टम और संकलन नीतियों के आधार पर, [[संकलन समय]] | कंपाइल-टाइम या [[रन टाइम (कार्यक्रम जीवनचक्र चरण)]] | रन-टाइम पर लागू होती हैं। उदाहरण के लिए, [[जावा (प्रोग्रामिंग भाषा)]] लैंग्वेज क्लाइंट कोड की अनुमति नहीं देती है जो किसी क्लास के निजी डेटा को कंपाइल करने के लिए एक्सेस करता है।
विभिन्न वस्तु-उन्मुख प्रोग्रामिंग भाषा सदस्य की पहुंच और दृश्यता को विभिन्न डिग्री तक प्रयुक्त करती हैं, और भाषा के प्रकार सिस्टम और संकलन नीतियों के आधार पर, [[संकलन समय]] | कंपाइल-टाइम या [[रन टाइम (कार्यक्रम जीवनचक्र चरण)|रन टाइम (कार्यक्रम जीवनचक्र वेरीएबलण)]] | रन-टाइम पर प्रयुक्त होती हैं। उदाहरण के लिए, [[जावा (प्रोग्रामिंग भाषा)]] भाषा क्लाइंट कोड की अनुमति नहीं देती है जो किसी क्लास के निजी डेटा को कंपाइल करने के लिए एक्सेस करता है।
<ref>{{cite web|url=http://introcs.cs.princeton.edu/java/11cheatsheet/errors.pdf |archive-url=https://web.archive.org/web/20111018094803/http://introcs.cs.princeton.edu/java/11cheatsheet/errors.pdf |archive-date=2011-10-18 |url-status=live|title=2.2 Identifiers|work=Compile and Runtime Errors in Java|first=Mordechai|last=Ben-Ari|date=2007-01-24|access-date=2012-05-07}}</ref> <!-- whereas in languages like [[Objective-C]] or [[Perl]] client code is not restricted.--> [[सी ++]] भाषा में, निजी तरीके दिखाई देते हैं, लेकिन इंटरफ़ेस में पहुंच योग्य नहीं हैं; हालाँकि, उन्हें पूरी तरह से अमूर्त वर्गों को स्पष्ट रूप से घोषित करके अदृश्य बनाया जा सकता है जो कक्षा के इंटरफेस का प्रतिनिधित्व करते हैं।<ref name="cppinterface">{{cite web|url=http://www.drdobbs.com/cpp/184410630|title=C++ Interfaces|last=Wild|first=Fred|work=Dr. Dobb's|publisher=UBM Techweb|access-date=2012-05-02}}</ref>
<ref>{{cite web|url=http://introcs.cs.princeton.edu/java/11cheatsheet/errors.pdf |archive-url=https://web.archive.org/web/20111018094803/http://introcs.cs.princeton.edu/java/11cheatsheet/errors.pdf |archive-date=2011-10-18 |url-status=live|title=2.2 Identifiers|work=Compile and Runtime Errors in Java|first=Mordechai|last=Ben-Ari|date=2007-01-24|access-date=2012-05-07}}</ref> <!-- whereas in languages like [[Objective-C]] or [[Perl]] client code is not restricted.--> [[सी ++]] भाषा में, निजी तरीके दिखाई देते हैं, लेकिन इंटरफ़ेस में पहुंच योग्य नहीं हैं; हालाँकि, उन्हें पूरी तरह से अमूर्त क्लासों को स्पष्ट रूप से घोषित करके अदृश्य बनाया जा सकता है जो कक्षा के इंटरफेस का प्रतिनिधित्व करते हैं।<ref name="cppinterface">{{cite web|url=http://www.drdobbs.com/cpp/184410630|title=C++ Interfaces|last=Wild|first=Fred|work=Dr. Dobb's|publisher=UBM Techweb|access-date=2012-05-02}}</ref>
कुछ भाषाओं में अन्य पहुँच-योग्यता योजनाएँ हैं:
कुछ भाषाओं में अन्य पहुँच-योग्यता योजनाएँ हैं:
* इंस्टेंस बनाम क्लास एक्सेसिबिलिटी: [[रूबी (प्रोग्रामिंग भाषा)]] क्रमशः क्लास-प्राइवेट और क्लास-प्रोटेक्टेड के बदले इंस्टेंस-प्राइवेट और इंस्टेंस-प्रोटेक्टेड एक्सेस स्पेसिफायर का समर्थन करती है। वे इसमें भिन्न हैं कि वे उदाहरण के वर्ग के बजाय उदाहरण के आधार पर ही पहुंच को प्रतिबंधित करते हैं।<ref>{{cite web | url=http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html | title=Classes, Objects, and Variables|work=Programming Ruby: The Pragmatic Programmer's Guide | last1=Thomas | last2=Hunt | publisher=Ruby-Doc.org | access-date=2012-04-26}}
* इंस्टेंस बनाम क्लास एक्सेसिबिलिटी: [[रूबी (प्रोग्रामिंग भाषा)]] क्रमशः क्लास-प्राइवेट और क्लास-प्रोटेक्टेड के बदले इंस्टेंस-प्राइवेट और इंस्टेंस-प्रोटेक्टेड एक्सेस स्पेसिफायर का समर्थन करती है। वे इसमें भिन्न हैं कि वे उदाहरण के क्लास के अतिरिक्त उदाहरण के आधार पर ही पहुंच को प्रतिबंधित करते हैं।<ref>{{cite web | url=http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html | title=Classes, Objects, and Variables|work=Programming Ruby: The Pragmatic Programmer's Guide | last1=Thomas | last2=Hunt | publisher=Ruby-Doc.org | access-date=2012-04-26}}
</ref>
</ref>
* मित्र: सी ++ एक तंत्र का समर्थन करता है जहां स्पष्ट रूप से वर्ग के मित्र कार्य के रूप में घोषित एक फ़ंक्शन निजी या संरक्षित के रूप में नामित सदस्यों तक पहुंच सकता है।<ref>{{cite web|url=http://www.cplusplus.com/doc/tutorial/inheritance/
* मित्र: सी ++ एक तंत्र का समर्थन करता है जहां स्पष्ट रूप से क्लास के मित्र कार्य के रूप में घोषित एक फ़ंक्शन निजी या संरक्षित के रूप में नामित सदस्यों तक पहुंच सकता है।<ref>{{cite web|url=http://www.cplusplus.com/doc/tutorial/inheritance/
|title=Friendship and inheritance|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-04-26}}</ref>
|title=Friendship and inheritance|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-04-26}}</ref>
* पथ-आधारित: जावा एक जावा सिंटैक्स # एक्सेस संशोधक के भीतर एक सदस्य तक पहुंच को प्रतिबंधित करने का समर्थन करता है, जो फ़ाइल का तार्किक पथ है। हालाँकि, संरक्षित सदस्यों तक पहुँचने के लिए फ्रेमवर्क क्लास के समान पैकेज में कक्षाओं को लागू करने के लिए जावा फ्रेमवर्क का विस्तार करना एक सामान्य अभ्यास है। स्रोत फ़ाइल पूरी तरह से अलग स्थान पर मौजूद हो सकती है, और एक अलग .jar फ़ाइल में तैनात की जा सकती है, फिर भी जहाँ तक JVM का संबंध है, उसी तार्किक पथ में हो।<ref name=JavaAccessControl />
* पथ-आधारित: जावा एक जावा सिंटैक्स # एक्सेस संशोधक के अंदरएक सदस्य तक पहुंच को प्रतिबंधित करने का समर्थन करता है, जो फ़ाइल का तार्किक पथ है। हालाँकि, संरक्षित सदस्यों तक पहुँचने के लिए रूपरेखा क्लास के समान पैकेज में क्लासेस को प्रयुक्त करने के लिए जावा रूपरेखा का विस्तार करना एक सामान्य अभ्यास है। स्रोत फ़ाइल पूरी तरह से अलग स्थान पर सम्मिलित हो सकती है, और एक अलग .jar फ़ाइल में तैनात की जा सकती है, फिर भी जहाँ तक JVM का संबंध है, उसी तार्किक पथ में हो।<ref name=JavaAccessControl />




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


=== रचना ===
=== रचना ===
कक्षाओं को अन्य वर्गों से बनाया जा सकता है, जिससे संलग्न वर्ग और उसके एम्बेडेड वर्गों के बीच [[एक]] रचनात्मक संबंध स्थापित किया जा सकता है। वर्गों के बीच रचनात्मक संबंध को आमतौर पर है-ए संबंध के रूप में भी जाना जाता है।{{sfn|Booch|1994|p=180}} उदाहरण के लिए, एक वर्ग कार से बना हो सकता है और इसमें एक वर्ग इंजन हो सकता है। इसलिए, एक कार में एक इंजन होता है। रचना का एक पहलू रोकथाम है, जो कि उनके पास मौजूद उदाहरण द्वारा घटक उदाहरणों का परिक्षेत्र है। यदि एक संलग्न वस्तु में मूल्य के अनुसार घटक उदाहरण होते हैं, तो घटक और उनके संलग्न वस्तु का एक समान [[वस्तु जीवनकाल]] होता है। यदि घटक संदर्भ द्वारा समाहित हैं, तो हो सकता है कि उनका जीवनकाल समान न हो।{{sfn|Booch|1994|p=128-129}} उदाहरण के लिए, ऑब्जेक्टिव-सी 2.0 में:
क्लासेस को अन्य क्लासों से बनाया जा सकता है, जिससे संलग्न क्लास और उसके एम्बेडेड क्लासों के बीच [[एक]] रचनात्मक संबंध स्थापित किया जा सकता है। क्लासों के बीच रचनात्मक संबंध को सामान्य रूप से है-ए संबंध के रूप में भी जाना जाता है।{{sfn|Booch|1994|p=180}} उदाहरण के लिए, एक क्लास कार से बना हो सकता है और इसमें एक क्लास इंजन हो सकता है। इसलिए, एक कार में एक इंजन होता है। रचना का एक रूपरूप रोकथाम है, जो कि उनके पास सम्मिलित उदाहरण द्वारा घटक उदाहरणों का परिक्षेत्र है। यदि एक संलग्न वस्तु में मूल्य के अनुसार घटक उदाहरण होते हैं, तो घटक और उनके संलग्न वस्तु का एक समान [[वस्तु जीवनकाल]] होता है। यदि घटक संदर्भ द्वारा समाहित हैं, तो हो सकता है कि उनका जीवनकाल समान न हो।{{sfn|Booch|1994|p=128-129}} उदाहरण के लिए, ऑब्जेक्टिव-सी 2.0 में:


<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
Line 83: Line 83:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


यह {{Mono|Car}} वर्ग का एक उदाहरण है {{Mono|NSString}} (एक [[स्ट्रिंग (कंप्यूटर विज्ञान)]] वस्तु), {{Mono|Engine}}, और {{Mono|NSArray}} (एक सरणी वस्तु)।
यह {{Mono|Car}} क्लास का एक उदाहरण है {{Mono|NSString}} (एक [[स्ट्रिंग (कंप्यूटर विज्ञान)]] वस्तु), {{Mono|Engine}}, और {{Mono|NSArray}} (एक सरणी वस्तु)।


=== श्रेणीबद्ध ===
=== श्रेणीबद्ध ===
कक्षाएं एक या एक से अधिक मौजूदा वर्गों से प्राप्त की जा सकती हैं, जिससे व्युत्पन्न-वर्गों (आधार वर्ग, मूल वर्ग या) के बीच एक श्रेणीबद्ध संबंध स्थापित किया जा सकता है{{vanchor|superclasses|SUPERCLASS}}) और व्युत्पन्न वर्ग (बाल वर्ग या उपवर्ग)। डिराइव्ड क्लास और डिराइव्ड-फ्रॉम क्लास के संबंध को आमतौर पर 'इज़-ए' रिलेशनशिप के रूप में जाना जाता है।{{sfn|Booch|1994|p=112}} उदाहरण के लिए, एक वर्ग 'बटन' वर्ग 'नियंत्रण' से प्राप्त किया जा सकता है। इसलिए, एक बटन एक नियंत्रण है। मूल वर्ग के संरचनात्मक और व्यवहारिक सदस्यों को बाल वर्ग द्वारा ''विरासत में'' दिया जाता है। व्युत्पन्न वर्ग उन अतिरिक्त संरचनात्मक सदस्यों (डेटा फ़ील्ड्स) और व्यवहारिक सदस्यों (विधियों) को परिभाषित कर सकते हैं, जिनके अलावा वे ''विरासत'' हैं और इसलिए उनके सुपरक्लास के ''विशेषज्ञता'' हैं। साथ ही, यदि भाषा अनुमति देती है तो व्युत्पन्न कक्षाएं विरासत में मिली विधियों को ओवरराइड कर सकती हैं।
क्लासेस एक या एक से अधिक सम्मिलिता क्लासों से प्राप्त की जा सकती हैं, जिससे व्युत्पन्न-क्लासों (आधार क्लास, मूल क्लास या) के बीच एक श्रेणीबद्ध संबंध स्थापित किया जा सकता है{{vanchor|superclasses|SUPERCLASS}}) और व्युत्पन्न क्लास (बाल क्लास या उपक्लास)। डिराइव्ड क्लास और डिराइव्ड-फ्रॉम क्लास के संबंध को सामान्य रूप से 'इज़-ए' रिलेशनशिप के रूप में जाना जाता है।{{sfn|Booch|1994|p=112}} उदाहरण के लिए, एक क्लास 'बटन' क्लास 'नियंत्रण' से प्राप्त किया जा सकता है। इसलिए, एक बटन एक नियंत्रण है। मूल क्लास के संरचनात्मक और व्यवहारिक सदस्यों को बाल क्लास द्वारा ''विरासत में'' दिया जाता है। व्युत्पन्न क्लास उन अतिरिक्त संरचनात्मक सदस्यों (डेटा क्षेत्र्स) और व्यवहारिक सदस्यों (विधियों) को परिभाषित कर सकते हैं, जिनके अलावा वे ''विरासत'' हैं और इसलिए उनके सुपरक्लास के ''विशेषज्ञता'' हैं। साथ ही, यदि भाषा अनुमति देती है तो व्युत्पन्न क्लासेस विरासत में मिली विधियों को ओवरराइड कर सकती हैं।


सभी भाषाएँ एकाधिक वंशानुक्रम का समर्थन नहीं करती हैं। उदाहरण के लिए, जावा एक वर्ग को कई इंटरफेस लागू करने की अनुमति देता है, लेकिन केवल एक वर्ग से प्राप्त होता है।<ref name="javainterface">{{cite web| url=http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html|title=इंटरफेस|work=The Java Tutorials|publisher=Oracle|access-date=2012-05-01}}</ref> यदि एकाधिक वंशानुक्रम की अनुमति है, तो पदानुक्रम एक निर्देशित चक्रीय ग्राफ (या संक्षेप में DAG) है, अन्यथा यह एक [[पेड़ (ग्राफ सिद्धांत)]] है। पदानुक्रम में नोड्स के रूप में कक्षाएं और लिंक के रूप में वंशानुक्रम संबंध हैं। विभिन्न स्तरों की कक्षाओं की तुलना में एक ही स्तर की कक्षाएं [[एसोसिएशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)]] होने की अधिक संभावना है। इस पदानुक्रम के स्तरों को लेयर (ऑब्जेक्ट-ओरिएंटेड डिज़ाइन) या [[अमूर्तता का स्तर]] कहा जाता है।
सभी भाषाएँ एकाधिक वंशानुक्रम का समर्थन नहीं करती हैं। उदाहरण के लिए, जावा एक क्लास को कई इंटरफेस प्रयुक्त करने की अनुमति देता है, लेकिन केवल एक क्लास से प्राप्त होता है।<ref name="javainterface">{{cite web| url=http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html|title=इंटरफेस|work=The Java Tutorials|publisher=Oracle|access-date=2012-05-01}}</ref> यदि एकाधिक वंशानुक्रम की अनुमति है, तो पदानुक्रम एक निर्देशित चक्रीय ग्राफ (या संक्षेप में DAG) है, अन्यथा यह एक [[पेड़ (ग्राफ सिद्धांत)]] है। पदानुक्रम में नोड्स के रूप में क्लासेस और लिंक के रूप में वंशानुक्रम संबंध हैं। विभिन्न स्तरों की क्लासेस की तुलना में एक ही स्तर की क्लासेस [[एसोसिएशन (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|एसोसिएशन (वस्तु-उन्मुख प्रोग्रामिंग)]] होने की अधिक संभावना है। इस पदानुक्रम के स्तरों को लेयर (वस्तु-उन्मुख डिज़ाइन) या [[अमूर्तता का स्तर]] कहा जाता है।


उदाहरण (आईफोन एसडीके से सरलीकृत उद्देश्य-सी 2.0 कोड):
उदाहरण (आईफोन एसडीके से सरलीकृत उद्देश्य-सी 2.0 कोड):
Line 99: Line 99:
इस उदाहरण में, एक UITableView एक UIScrollView है एक UIView एक UIResponder एक NSObject है।
इस उदाहरण में, एक UITableView एक UIScrollView है एक UIView एक UIResponder एक NSObject है।


==== उपवर्ग की परिभाषाएँ ====
==== उपक्लास की परिभाषाएँ ====
{{Main|Inheritance (object-oriented programming)|Superclass (computer science)|Subclass (computer science)}}
{{Main|Inheritance (object-oriented programming)|Superclass (computer science)|Subclass (computer science)}}
संकल्पनात्मक रूप से, एक सुपरक्लास अपने उपवर्गों का [[सुपरसेट]] है। उदाहरण के लिए, एक सामान्य वर्ग पदानुक्रम शामिल होगा {{Mono|GraphicObject}} के सुपरक्लास के रूप में {{Mono|Rectangle}} और {{Mono|Ellipse}}, जबकि {{Mono|Square}} का एक उपवर्ग होगा {{Mono|Rectangle}}. ये सभी समुच्चय सिद्धांत में भी उपसमुच्चय हैं, अर्थात, सभी वर्ग आयत हैं लेकिन सभी आयत वर्ग नहीं हैं।
संकल्पनात्मक रूप से, एक सुपरक्लास अपने उपक्लासों का [[सुपरसेट]] है। उदाहरण के लिए, एक सामान्य क्लास पदानुक्रम सम्मिलित होगा {{Mono|GraphicObject}} के सुपरक्लास के रूप में {{Mono|Rectangle}} और {{Mono|Ellipse}}, जबकि {{Mono|Square}} का एक उपक्लास होगा {{Mono|Rectangle}}. ये सभी समुच्चय सिद्धांत में भी उपसमुच्चय हैं, अर्थात, सभी क्लास आयत हैं लेकिन सभी आयत क्लास नहीं हैं।


एक सामान्य वैचारिक त्रुटि एक उपवर्ग के साथ संबंध के एक हिस्से की गलती करना है। उदाहरण के लिए, एक कार और ट्रक दोनों प्रकार के वाहन हैं और उन्हें वाहन वर्ग के उपवर्गों के रूप में मॉडल करना उचित होगा। हालांकि, उपवर्ग संबंधों के रूप में कार के घटक भागों को मॉडल करना एक त्रुटि होगी। उदाहरण के लिए, एक कार एक इंजन और बॉडी से बनी होती है, लेकिन कार के एक उपवर्ग के रूप में इंजन या बॉडी को मॉडल करना उचित नहीं होगा।
एक सामान्य वैचारिक त्रुटि एक उपक्लास के साथ संबंध के एक हिस्से की गलती करना है। उदाहरण के लिए, एक कार और ट्रक दोनों प्रकार के वाहन हैं और उन्हें वाहन क्लास के उपक्लासों के रूप में मॉडल करना उचित होगा। हालांकि, उपक्लास संबंधों के रूप में कार के घटक भागों को मॉडल करना एक त्रुटि होगी। उदाहरण के लिए, एक कार एक इंजन और बॉडी से बनी होती है, लेकिन कार के एक उपक्लास के रूप में इंजन या बॉडी को मॉडल करना उचित नहीं होगा।


[[वस्तु-उन्मुख मॉडलिंग]] में इस प्रकार के संबंध आमतौर पर ऑब्जेक्ट गुणों के रूप में तैयार किए जाते हैं। इस उदाहरण में, {{Mono|Car}} क्लास में एक संपत्ति होगी {{Mono|parts}}. {{Mono|parts}} वस्तुओं का एक संग्रह रखने के लिए टाइप किया जाएगा, जैसे कि उदाहरण {{Mono|Body}}, {{Mono|Engine}}, {{Mono|Tires}}, वगैरह।
[[वस्तु-उन्मुख मॉडलिंग]] में इस प्रकार के संबंध सामान्य रूप से ऑब्जेक्ट गुणों के रूप में तैयार किए जाते हैं। इस उदाहरण में, {{Mono|Car}} क्लास में एक संपत्ति होगी {{Mono|parts}}. {{Mono|parts}} वस्तुओं का एक संग्रह रखने के लिए टाइप किया जाएगा, जैसे कि उदाहरण {{Mono|Body}}, {{Mono|Engine}}, {{Mono|Tires}}, वगैरह।
ऑब्जेक्ट मॉडलिंग लैंग्वेज जैसे कि यूनिफाइड मॉडलिंग लैंग्वेज में भाग और अन्य प्रकार के संबंधों के विभिन्न पहलुओं को मॉडल करने की क्षमता शामिल है - डेटा जैसे कि वस्तुओं की प्रमुखता, इनपुट और आउटपुट मूल्यों पर बाधाएं, आदि। इस जानकारी का उपयोग डेवलपर टूल द्वारा किया जा सकता है वस्तुओं के लिए मूल डेटा परिभाषाओं के साथ अतिरिक्त कोड उत्पन्न करें, जैसे कि म्यूटेटर विधि पर त्रुटि जाँच।<ref>{{cite web|title=UML-to-Java transformation in IBM Rational Software Architect editions and related software|url=http://www.ibm.com/developerworks/rational/library/08/1202_berfeld/|publisher=[[IBM]]|date=2 December 2008|first=Marya|last=Berfeld|access-date=20 December 2013}}</ref>
ऑब्जेक्ट मॉडलिंग भाषा जैसे कि यूनिफाइड मॉडलिंग भाषा में भाग और अन्य प्रकार के संबंधों के विभिन्न पहलुओं को मॉडल करने की क्षमता सम्मिलित है - डेटा जैसे कि वस्तुओं की प्रमुखता, इनपुट और आउटपुट मूल्यों पर बाधाएं, आदि। इस जानकारी का उपयोग डेवलपर टूल द्वारा किया जा सकता है वस्तुओं के लिए मूल डेटा परिभाषाओं के साथ अतिरिक्त कोड उत्पन्न करें, जैसे कि म्यूटेटर विधि पर त्रुटि जाँच।<ref>{{cite web|title=UML-to-Java transformation in IBM Rational Software Architect editions and related software|url=http://www.ibm.com/developerworks/rational/library/08/1202_berfeld/|publisher=[[IBM]]|date=2 December 2008|first=Marya|last=Berfeld|access-date=20 December 2013}}</ref>
ऑब्जेक्ट क्लास सिस्टम को मॉडलिंग और कार्यान्वित करते समय एक महत्वपूर्ण सवाल यह है कि क्या एक क्लास में एक या एक से अधिक सुपरक्लास हो सकते हैं। वास्तविक दुनिया में वास्तविक सेट के साथ ऐसा सेट मिलना दुर्लभ होगा जो एक से अधिक अन्य सेट के साथ नहीं मिला हो। हालाँकि, जबकि कुछ प्रणालियाँ जैसे फ्लेवर और सीएलओएस एक से अधिक माता-पिता को रन टाइम पर ऐसा करने की क्षमता प्रदान करते हैं, जटिलता का परिचय देते हैं कि ऑब्जेक्ट-ओरिएंटेड समुदाय में कई लोग पहली बार में ऑब्जेक्ट क्लास का उपयोग करने के लक्ष्यों के लिए विरोधाभासी मानते हैं। एक से अधिक सुपरक्लास के साथ काम करते समय यह समझना जटिल हो सकता है कि संदेश को संभालने के लिए कौन सी कक्षा जिम्मेदार होगी। यदि लापरवाही से उपयोग किया जाता है तो यह सुविधा उसी प्रणाली की कुछ जटिलताओं को पेश कर सकती है और अस्पष्टता वर्गों से बचने के लिए डिज़ाइन की गई थी।<ref>{{cite book|last=Jacobsen|first=Ivar|title=Object Oriented Software Engineering|year=1992|publisher=Addison-Wesley ACM Press|isbn=0-201-54435-0|pages=[https://archive.org/details/objectorientedso00jaco/page/43 43–69]|author2=Magnus Christerson|author3=Patrik Jonsson|author4=Gunnar Overgaard|url=https://archive.org/details/objectorientedso00jaco/page/43}}</ref>
ऑब्जेक्ट क्लास सिस्टम को मॉडलिंग और कार्यान्वित करते समय एक महत्वपूर्ण सवाल यह है कि क्या एक क्लास में एक या एक से अधिक सुपरक्लास हो सकते हैं। वास्तविक दुनिया में वास्तविक सेट के साथ ऐसा सेट मिलना दुर्लभ होगा जो एक से अधिक अन्य सेट के साथ नहीं मिला हो। हालाँकि, जबकि कुछ प्रणालियाँ जैसे फ्लेवर और सीएलओएस एक से अधिक माता-पिता को रन टाइम पर ऐसा करने की क्षमता प्रदान करते हैं, जटिलता का परिचय देते हैं कि वस्तु-उन्मुख समुदाय में कई लोग पहली बार में ऑब्जेक्ट क्लास का उपयोग करने के लक्ष्यों के लिए विरोधाभासी मानते हैं। एक से अधिक सुपरक्लास के साथ काम करते समय यह समझना जटिल हो सकता है कि संदेश को संभालने के लिए कौन सी कक्षा जिम्मेदार होगी। यदि लापरवाही से उपयोग किया जाता है तो यह सुविधा उसी प्रणाली की कुछ जटिलताओं को पेश कर सकती है और अस्पष्टता क्लासों से बचने के लिए डिज़ाइन की गई थी।<ref>{{cite book|last=Jacobsen|first=Ivar|title=Object Oriented Software Engineering|year=1992|publisher=Addison-Wesley ACM Press|isbn=0-201-54435-0|pages=[https://archive.org/details/objectorientedso00jaco/page/43 43–69]|author2=Magnus Christerson|author3=Patrik Jonsson|author4=Gunnar Overgaard|url=https://archive.org/details/objectorientedso00jaco/page/43}}</ref>
अधिकांश आधुनिक वस्तु-उन्मुख भाषाओं जैसे कि स्मॉलटाक और जावा को रन टाइम पर एकल वंशानुक्रम की आवश्यकता होती है। इन भाषाओं के लिए, एकाधिक विरासत मॉडलिंग के लिए उपयोगी हो सकती है लेकिन कार्यान्वयन के लिए नहीं।
अधिकांश आधुनिक वस्तु-उन्मुख भाषाओं जैसे कि स्मॉलटाक और जावा को रन टाइम पर एकल वंशानुक्रम की आवश्यकता होती है। इन भाषाओं के लिए, एकाधिक विरासत मॉडलिंग के लिए उपयोगी हो सकती है लेकिन कार्यान्वयन के लिए नहीं।


हालाँकि, [[सेमांटिक वेब]] एप्लिकेशन ऑब्जेक्ट्स में कई सुपरक्लास होते हैं। इंटरनेट की अस्थिरता के लिए इस स्तर के लचीलेपन की आवश्यकता होती है और तकनीकी मानकों जैसे कि [[वेब ओन्टोलॉजी भाषा]] | वेब ओन्टोलॉजी लैंग्वेज (OWL) को इसका समर्थन करने के लिए डिज़ाइन किया गया है।
हालाँकि, [[सेमांटिक वेब]] एप्लिकेशन ऑब्जेक्ट्स में कई सुपरक्लास होते हैं। इंटरनेट की अस्थिरता के लिए इस स्तर के लचीलेपन की आवश्यकता होती है और तकनीकी मानकों जैसे कि [[वेब ओन्टोलॉजी भाषा]] | वेब ओन्टोलॉजी भाषा (OWL) को इसका समर्थन करने के लिए डिज़ाइन किया गया है।


इसी तरह का मुद्दा यह है कि क्या रन टाइम पर क्लास पदानुक्रम को संशोधित किया जा सकता है या नहीं। फ़्लेवर, सीएलओएस और स्मॉलटॉक जैसी भाषाएँ सभी अपने [[मेटा-ऑब्जेक्ट प्रोटोकॉल]] के भाग के रूप में इस सुविधा का समर्थन करती हैं। चूंकि कक्षाएं स्वयं प्रथम श्रेणी की वस्तुएं हैं, इसलिए संभव है कि उन्हें उचित संदेश भेजकर उनकी संरचना को गतिशील रूप से बदल दिया जाए। अन्य भाषाएँ जो मजबूत टाइपिंग पर अधिक ध्यान केंद्रित करती हैं जैसे कि जावा और सी ++, क्लास पदानुक्रम को रन टाइम पर संशोधित करने की अनुमति नहीं देती हैं। सिमेंटिक वेब ऑब्जेक्ट्स में कक्षाओं में रन टाइम परिवर्तन की क्षमता होती है। तर्कसंगत कई सुपरक्लास को अनुमति देने के औचित्य के समान है, कि इंटरनेट इतना गतिशील और लचीला है कि इस अस्थिरता को प्रबंधित करने के लिए पदानुक्रम में गतिशील परिवर्तन आवश्यक हैं।<ref>{{cite web|url=http://www.w3.org/2001/sw/BestPractices/SE/ODSD/|title=A Semantic Web Primer for Object-Oriented Software Developers|last1=Knublauch|first1=Holger|last2=Oberle|first2=Daniel|last3=Tetlow|first3=Phil|last4=Wallace|first4=Evan|publisher=[[W3C]]|date=2006-03-09|access-date=2008-07-30}}</ref>
इसी तरह का मुद्दा यह है कि क्या रन टाइम पर क्लास पदानुक्रम को संशोधित किया जा सकता है या नहीं। फ़्लेवर, सीएलओएस और स्मॉलटॉक जैसी भाषाएँ सभी अपने [[मेटा-ऑब्जेक्ट प्रोटोकॉल]] के भाग के रूप में इस सुविधा का समर्थन करती हैं। चूंकि क्लासेस स्वयं प्रथम श्रेणी की वस्तुएं हैं, इसलिए संभव है कि उन्हें उचित संदेश भेजकर उनकी संरचना को गतिशील रूप से बदल दिया जाए। अन्य भाषाएँ जो मजबूत टाइपिंग पर अधिक ध्यान केंद्रित करती हैं जैसे कि जावा और सी ++, क्लास पदानुक्रम को रन टाइम पर संशोधित करने की अनुमति नहीं देती हैं। सिमेंटिक वेब ऑब्जेक्ट्स में क्लासेस में रन टाइम परिवर्तन की क्षमता होती है। तर्कसंगत कई सुपरक्लास को अनुमति देने के औचित्य के समान है, कि इंटरनेट इतना गतिशील और लचीला है कि इस अस्थिरता को प्रबंधित करने के लिए पदानुक्रम में गतिशील परिवर्तन आवश्यक हैं।<ref>{{cite web|url=http://www.w3.org/2001/sw/BestPractices/SE/ODSD/|title=A Semantic Web Primer for Object-Oriented Software Developers|last1=Knublauch|first1=Holger|last2=Oberle|first2=Daniel|last3=Tetlow|first3=Phil|last4=Wallace|first4=Evan|publisher=[[W3C]]|date=2006-03-09|access-date=2008-07-30}}</ref>




=== वर्ग अवधारणा और वंशानुक्रम की रूढ़िवादिता ===
=== क्लास अवधारणा और वंशानुक्रम की रूढ़िवादिता ===
हालाँकि वर्ग-आधारित भाषाओं को आमतौर पर वंशानुक्रम का समर्थन करने के लिए माना जाता है, वंशानुक्रम वर्गों की अवधारणा का एक आंतरिक पहलू नहीं है। कुछ भाषाएँ, जिन्हें अक्सर [[वस्तु-आधारित भाषाएँ]] कहा जाता है, कक्षाओं का समर्थन करती हैं, फिर भी वंशानुक्रम का समर्थन नहीं करती हैं। वस्तु-आधारित भाषाओं के उदाहरणों में [[मूल दृश्य]] के पुराने संस्करण शामिल हैं।<!-- do not provide the structural benefits of statically type-checked interfaces for objects. This is because in object-based languages, it is possible to use and extend data structures and attach methods to them at run-time. This precludes the compiler or interpreter being able to check the type information specified in the source code as the type is built dynamically and not defined statically. Most of these languages allow for ''instance behavior'' and complex ''operational polymorphism'' (see [[dynamic dispatch]] and [[Polymorphism (computer science)|polymorphism]]). -->
हालाँकि क्लास-आधारित भाषाओं को सामान्य रूप से वंशानुक्रम का समर्थन करने के लिए माना जाता है, वंशानुक्रम क्लासों की अवधारणा का एक आंतरिक रूपरूप नहीं है। कुछ भाषाएँ, जिन्हें प्रायः [[वस्तु-आधारित भाषाएँ]] कहा जाता है, क्लासेस का समर्थन करती हैं, फिर भी वंशानुक्रम का समर्थन नहीं करती हैं। वस्तु-आधारित भाषाओं के उदाहरणों में [[मूल दृश्य]] के पुराने संस्करण सम्मिलित हैं।<!-- do not provide the structural benefits of statically type-checked interfaces for objects. This is because in object-based languages, it is possible to use and extend data structures and attach methods to them at run-time. This precludes the compiler or interpreter being able to check the type information specified in the source code as the type is built dynamically and not defined statically. Most of these languages allow for ''instance behavior'' and complex ''operational polymorphism'' (see [[dynamic dispatch]] and [[Polymorphism (computer science)|polymorphism]]). -->




=== वस्तु-उन्मुख विश्लेषण के भीतर <!-- belongs in an Object-Oriented Analysis article--> ===
=== वस्तु-उन्मुख विश्लेषण के भीतर <!-- belongs in an Object-Oriented Analysis article--> ===
{{Main|Association (object-oriented programming)}}<!--consider moving a bunch of stuff here to this page...-->
{{Main|Association (object-oriented programming)}}<!--consider moving a bunch of stuff here to this page...-->
[[वस्तु-उन्मुख विश्लेषण और डिजाइन]]|ऑब्जेक्ट-ओरिएंटेड एनालिसिस और [[एकीकृत मॉडलिंग भाषा]] में, दो वर्गों के बीच एक जुड़ाव कक्षाओं या उनके संबंधित उदाहरणों के बीच सहयोग का प्रतिनिधित्व करता है। संघों की दिशा है; उदाहरण के लिए, दो वर्गों के बीच एक द्वि-दिशात्मक जुड़ाव इंगित करता है कि दोनों वर्ग अपने संबंधों से अवगत हैं।<ref name="ibmuml">{{cite web| url=http://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell/|title=UML Basics: The class diagram|last=Bell|first=Donald|work=developer Works|publisher=IBM|access-date=2012-05-02}}</ref> संघों को उनके नाम या उद्देश्य के अनुसार लेबल किया जा सकता है।{{sfn|Booch|1994|p=179}}
[[वस्तु-उन्मुख विश्लेषण और डिजाइन]]|वस्तु-उन्मुख एनालिसिस और [[एकीकृत मॉडलिंग भाषा]] में, दो क्लासों के बीच एक जुड़ाव क्लासेस या उनके संबंधित उदाहरणों के बीच सहयोग का प्रतिनिधित्व करता है। संघों की दिशा है; उदाहरण के लिए, दो क्लासों के बीच एक द्वि-दिशात्मक जुड़ाव इंगित करता है कि दोनों क्लास अपने संबंधों से अवगत हैं।<ref name="ibmuml">{{cite web| url=http://www.ibm.com/developerworks/rational/library/content/RationalEdge/sep04/bell/|title=UML Basics: The class diagram|last=Bell|first=Donald|work=developer Works|publisher=IBM|access-date=2012-05-02}}</ref> संघों को उनके नाम या उद्देश्य के अनुसार लेबल किया जा सकता है।{{sfn|Booch|1994|p=179}}
एक संघ की भूमिका को एक संघ का अंत दिया जाता है और संबंधित वर्ग की भूमिका का वर्णन करता है। उदाहरण के लिए, एक सब्सक्राइबर भूमिका उस तरीके का वर्णन करती है जिस तरह से क्लास पर्सन क्लास मैगज़ीन के साथ सब्स्क्राइबर्स-टू एसोसिएशन में भाग लेते हैं। साथ ही, एक पत्रिका की उसी संघ में सदस्यता वाली पत्रिका की भूमिका होती है। एसोसिएशन भूमिका बहुलता बताती है कि एसोसिएशन के अन्य वर्ग के प्रत्येक उदाहरण के कितने उदाहरण हैं। सामान्य गुणक 0..1 , 1..1 , 1..* और 0..* हैं, जहां * किसी भी संख्या में उदाहरणों को निर्दिष्ट करता है।<ref name=ibmuml />
एक संघ की भूमिका को एक संघ का अंत दिया जाता है और संबंधित क्लास की भूमिका का वर्णन करता है। उदाहरण के लिए, एक सब्सक्राइबर भूमिका उस तरीके का वर्णन करती है जिस तरह से क्लास पर्सन क्लास मैगज़ीन के साथ सब्स्क्राइबर्स-टू एसोसिएशन में भाग लेते हैं। साथ ही, एक पत्रिका की उसी संघ में सदस्यता वाली पत्रिका की भूमिका होती है। एसोसिएशन भूमिका बहुलता बताती है कि एसोसिएशन के अन्य क्लास के प्रत्येक उदाहरण के कितने उदाहरण हैं। सामान्य गुणक 0..1 , 1..1 , 1..* और 0..* हैं, जहां * किसी भी संख्या में उदाहरणों को निर्दिष्ट करता है।<ref name=ibmuml />




== वर्गों का वर्गीकरण ==
== क्लासों का क्लासीकरण ==
वर्गों की कई श्रेणियां हैं, जिनमें से कुछ ओवरलैप हैं।
क्लासों की कई श्रेणियां हैं, जिनमें से कुछ ओवरलैप हैं।


=== <स्पैन क्लास = एंकर आईडी = एब्सट्रैक्ट_एंड_कंक्रीट_क्लासेस ></span><span क्लास = एंकर आईडी = एब्सट्रेक्ट_एंड_कंक्रीट ></span> एब्सट्रैक्ट और कंक्रीट ===
=== <स्पैन क्लास = एंकर आईडी = एब्सट्रैक्ट_एंड_कंक्रीट_क्लासेस ></span><span क्लास = एंकर आईडी = एब्सट्रेक्ट_एंड_कंक्रीट ></span> एब्सट्रैक्ट और कंक्रीट ===
{{Main|Abstract type}}
{{Main|Abstract type}}
विरासत का समर्थन करने वाली भाषा में, एक सार वर्ग, या सार आधार वर्ग (एबीसी), एक वर्ग है जिसे तत्काल नहीं किया जा सकता है क्योंकि इसे या तो सार के रूप में लेबल किया गया है या यह केवल अमूर्त विधियों (या 'वर्चुअल विधियों'') को निर्दिष्ट करता है। एक सार वर्ग कुछ विधियों का कार्यान्वयन प्रदान कर सकता है, और प्रकार के हस्ताक्षर के माध्यम से [[आभासी विधि]]यों को भी निर्दिष्ट कर सकता है जो कि अमूर्त वर्ग के प्रत्यक्ष या अप्रत्यक्ष वंशजों द्वारा कार्यान्वित किया जाना है। इससे पहले कि एक अमूर्त वर्ग से प्राप्त एक वर्ग को तत्काल किया जा सके, उसके मूल वर्ग के सभी अमूर्त तरीकों को व्युत्पत्ति श्रृंखला में कुछ वर्ग द्वारा लागू किया जाना चाहिए।<ref name="cpppoly">{{cite web|url=http://www.cplusplus.com/doc/tutorial/polymorphism/
विरासत का समर्थन करने वाली भाषा में, एक सार क्लास, या सार आधार क्लास (एबीसी), एक क्लास है जिसे तत्काल नहीं किया जा सकता है क्योंकि इसे या तो सार के रूप में लेबल किया गया है या यह केवल अमूर्त विधियों (या 'वर्चुअल विधियों'') को निर्दिष्ट करता है। एक सार क्लास कुछ विधियों का कार्यान्वयन प्रदान कर सकता है, और प्रकार के हस्ताक्षर के माध्यम से [[आभासी विधि]]यों को भी निर्दिष्ट कर सकता है जो कि अमूर्त क्लास के प्रत्यक्ष या अप्रत्यक्ष वंशजों द्वारा कार्यान्वित किया जाना है। इससे पहले कि एक अमूर्त क्लास से प्राप्त एक क्लास को तत्काल किया जा सके, उसके मूल क्लास के सभी अमूर्त तरीकों को व्युत्पत्ति श्रृंखला में कुछ क्लास द्वारा प्रयुक्त किया जाना चाहिए।<ref name="cpppoly">{{cite web|url=http://www.cplusplus.com/doc/tutorial/polymorphism/
|title=बहुरूपता|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-05-02}}</ref>
|title=बहुरूपता|work=C++ Language Tutorial|publisher=cplusplus.com|access-date=2012-05-02}}</ref>''
अधिकांश ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज प्रोग्रामर को यह निर्दिष्ट करने की अनुमति देती हैं कि किन वर्गों को अमूर्त माना जाता है और इन्हें तत्काल करने की अनुमति नहीं दी जाएगी। उदाहरण के लिए, Java (प्रोग्रामिंग लैंग्वेज), C Sharp (प्रोग्रामिंग लैंग्वेज)|C# और [[PHP]] में, कीवर्ड एब्स्ट्रैक्ट का उपयोग किया जाता है।<ref>{{cite web| url=http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html|title=Abstract Methods and Classes|work=The Java Tutorials|publisher=Oracle|access-date=2012-05-02}}</ref><ref>{{cite web|url=http://php.net/manual/en/language.oop5.abstract.php|title=Class Abstraction|work=PHP Manual|publisher=The PHP Group|access-date=2012-05-02}}</ref> सी ++ में, एक सार वर्ग एक वर्ग है जिसमें कम से कम एक अमूर्त विधि है जो उस भाषा में उचित सिंटैक्स द्वारा दी गई है (सी ++ पार्लेंस में एक शुद्ध वर्चुअल फ़ंक्शन)।<ref name=cpppoly />
अधिकांश वस्तु-उन्मुख प्रोग्रामिंग भाषा प्रोग्रामर को यह निर्दिष्ट करने की अनुमति देती हैं कि किन क्लासों को अमूर्त माना जाता है और इन्हें तत्काल करने की अनुमति नहीं दी जाएगी। उदाहरण के लिए, Java (प्रोग्रामिंग भाषा), C Sharp (प्रोग्रामिंग भाषा)|C# और [[PHP]] में, कीवर्ड एब्स्ट्रैक्ट का उपयोग किया जाता है।<ref>{{cite web| url=http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html|title=Abstract Methods and Classes|work=The Java Tutorials|publisher=Oracle|access-date=2012-05-02}}</ref><ref>{{cite web|url=http://php.net/manual/en/language.oop5.abstract.php|title=Class Abstraction|work=PHP Manual|publisher=The PHP Group|access-date=2012-05-02}}</ref> सी ++ में, एक सार क्लास एक क्लास है जिसमें कम से कम एक अमूर्त विधि है जो उस भाषा में उचित सिंटैक्स द्वारा दी गई है (सी ++ पार्लेंस में एक शुद्ध वर्चुअल फ़ंक्शन)।<ref name=cpppoly />


एक वर्ग जिसमें केवल आभासी विधियाँ होती हैं, उसे C++ में शुद्ध सार आधार वर्ग (या शुद्ध ABC) कहा जाता है और इसे भाषा के उपयोगकर्ताओं द्वारा इंटरफ़ेस के रूप में भी जाना जाता है।<ref name=cppinterface />अन्य भाषाएँ, विशेष रूप से जावा और सी #, भाषा में एक कीवर्ड के माध्यम से [[इंटरफ़ेस (जावा)]] नामक सार वर्गों के एक संस्करण का समर्थन करती हैं। इन भाषाओं में, [[एकाधिक वंशानुक्रम]] की अनुमति नहीं है, लेकिन एक वर्ग कई इंटरफेस लागू कर सकता है। ऐसी कक्षा में केवल सार सार्वजनिक रूप से सुलभ विधियां हो सकती हैं।<ref name=javainterface /><ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/ms173156.aspx | title=Interfaces (C# Programming Guide) | work=C# Programming Guide | publisher=Microsoft | access-date=2013-08-15}}
एक क्लास जिसमें केवल आभासी विधियाँ होती हैं, उसे C++ में शुद्ध सार आधार क्लास (या शुद्ध ABC) कहा जाता है और इसे भाषा के उपयोगकर्ताओं द्वारा इंटरफ़ेस के रूप में भी जाना जाता है।<ref name=cppinterface />अन्य भाषाएँ, विशेष रूप से जावा और सी #, भाषा में एक कीवर्ड के माध्यम से [[इंटरफ़ेस (जावा)]] नामक सार क्लासों के एक संस्करण का समर्थन करती हैं। इन भाषाओं में, [[एकाधिक वंशानुक्रम]] की अनुमति नहीं है, लेकिन एक क्लास कई इंटरफेस प्रयुक्त कर सकता है। ऐसी कक्षा में केवल सार सार्वजनिक रूप से सुलभ विधियां हो सकती हैं।<ref name=javainterface /><ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/ms173156.aspx | title=Interfaces (C# Programming Guide) | work=C# Programming Guide | publisher=Microsoft | access-date=2013-08-15}}
</ref><ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/ms173149.aspx | title=Inheritance (C# Programming Guide) | work=C# Programming Guide | publisher=Microsoft | access-date=2012-05-02}}
</ref><ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/ms173149.aspx | title=Inheritance (C# Programming Guide) | work=C# Programming Guide | publisher=Microsoft | access-date=2012-05-02}}
</ref>
</ref>
<!--Abstract classes defined as interfaces are a much more specific usage of the more general meaning of the term ''interface'', even as used in computer science, and the concept of interfaces has seen much usage and popularity within the realm of languages that support object-orientation.-->
<!--Abstract classes defined as interfaces are a much more specific usage of the more general meaning of the term ''interface'', even as used in computer science, and the concept of interfaces has seen much usage and popularity within the realm of languages that support object-orientation.-->
एक ठोस वर्ग एक ऐसा वर्ग है जो अमूर्त वर्गों के विपरीत [[तात्कालिकता (कंप्यूटर विज्ञान)]] हो सकता है, जो नहीं कर सकता। <!-- (In "Advanced C++ Programming Styles and Idioms", James Coplien defines "concrete class" as a class that has implicitly generated or explicitly defined special member functions that enable a class object to behave as do built-in types. These "concrete classes", then, adhere to the "Orthodox Canonical Form". Many developers who first learned the term as such, way back then, still primarily use it that way). -->
एक ठोस क्लास एक ऐसा क्लास है जो अमूर्त क्लासों के विपरीत [[तात्कालिकता (कंप्यूटर विज्ञान)]] हो सकता है, जो नहीं कर सकता। <!-- (In "Advanced C++ Programming Styles and Idioms", James Coplien defines "concrete class" as a class that has implicitly generated or explicitly defined special member functions that enable a class object to behave as do built-in types. These "concrete classes", then, adhere to the "Orthodox Canonical Form". Many developers who first learned the term as such, way back then, still primarily use it that way). -->




=== स्थानीय और आंतरिक ===
=== स्थानीय और आंतरिक ===
कुछ भाषाओं में, कक्षाओं को वैश्विक दायरे के अलावा [[कार्यक्षेत्र (प्रोग्रामिंग)]] में घोषित किया जा सकता है। इस तरह के कई प्रकार के वर्ग हैं।
कुछ भाषाओं में, क्लासेस को वैश्विक दायरे के अलावा [[कार्यक्षेत्र (प्रोग्रामिंग)]] में घोषित किया जा सकता है। इस तरह के कई प्रकार के क्लास हैं।


एक आंतरिक वर्ग एक अन्य वर्ग के भीतर परिभाषित वर्ग है। एक आंतरिक वर्ग और उसके युक्त वर्ग के बीच संबंध को दूसरे प्रकार के वर्ग संघ के रूप में भी माना जा सकता है। एक आंतरिक वर्ग आमतौर पर न तो संलग्न वर्ग के उदाहरणों से जुड़ा होता है और न ही इसके संलग्न वर्ग के साथ तत्काल होता है। भाषा के आधार पर, संलग्न कक्षा के बाहर से कक्षा को संदर्भित करना संभव हो सकता है या नहीं भी हो सकता है। एक संबंधित अवधारणा ''आंतरिक प्रकार'' है, जिसे ''आंतरिक डेटा प्रकार'' या ''नेस्टेड प्रकार'' के रूप में भी जाना जाता है, जो आंतरिक वर्गों की अवधारणा का एक सामान्यीकरण है। C++ एक ऐसी भाषा का उदाहरण है जो आंतरिक कक्षाओं और आंतरिक प्रकारों दोनों का समर्थन करती है ("टाइपपीफ" घोषणाओं के माध्यम से)।<ref>{{cite web | url=http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr061.htm | title=Nested classes (C++ only) | work=XL C/C++ V8.0 for AIX | publisher=IBM | access-date=2012-05-07
एक आंतरिक क्लास एक अन्य क्लास के अंदरपरिभाषित क्लास है। एक आंतरिक क्लास और उसके युक्त क्लास के बीच संबंध को दूसरे प्रकार के क्लास संघ के रूप में भी माना जा सकता है। एक आंतरिक क्लास सामान्य रूप से न तो संलग्न क्लास के उदाहरणों से जुड़ा होता है और न ही इसके संलग्न क्लास के साथ तत्काल होता है। भाषा के आधार पर, संलग्न कक्षा के बाहर से कक्षा को संदर्भित करना संभव हो सकता है या नहीं भी हो सकता है। एक संबंधित अवधारणा ''आंतरिक प्रकार'' है, जिसे ''आंतरिक डेटा प्रकार'' या ''नेस्टेड प्रकार'' के रूप में भी जाना जाता है, जो आंतरिक क्लासों की अवधारणा का एक सामान्यीकरण है। C++ एक ऐसी भाषा का उदाहरण है जो आंतरिक क्लासेस और आंतरिक प्रकारों दोनों का समर्थन करती है ("टाइपपीफ" घोषणाओं के माध्यम से)।<ref>{{cite web | url=http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr061.htm | title=Nested classes (C++ only) | work=XL C/C++ V8.0 for AIX | publisher=IBM | access-date=2012-05-07
}}</ref><ref>{{cite web | url=http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr063.htm | title=Local type names (C++ only) | work=XL C/C++ V8.0 for AIX | publisher=IBM | access-date=2012-05-07
}}</ref><ref>{{cite web | url=http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr063.htm | title=Local type names (C++ only) | work=XL C/C++ V8.0 for AIX | publisher=IBM | access-date=2012-05-07
}}
}}
</ref>
</ref>
एक अन्य प्रकार एक स्थानीय वर्ग है, जो एक प्रक्रिया या कार्य के भीतर परिभाषित वर्ग है। यह वर्ग के नाम के संदर्भ को उस दायरे के भीतर सीमित करता है जहां कक्षा घोषित की जाती है। भाषा के सिमेंटिक नियमों के आधार पर, स्थानीय वर्गों पर गैर-स्थानीय लोगों की तुलना में अतिरिक्त प्रतिबंध हो सकते हैं। एक सामान्य प्रतिबंध स्थानीय वर्ग विधियों को संलग्न कार्य के स्थानीय चर तक पहुँचने के लिए अस्वीकार करना है। उदाहरण के लिए, C ++ में, एक स्थानीय वर्ग अपने संलग्न कार्य के भीतर घोषित स्थिर चर को संदर्भित कर सकता है, लेकिन फ़ंक्शन के [[स्वचालित चर]] तक नहीं पहुंच सकता है।<ref>{{cite web | url=http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr062.htm | title=Local classes (C++ only) | work=XL C/C++ V8.0 for AIX | publisher=IBM | access-date=2012-05-07
एक अन्य प्रकार एक स्थानीय क्लास है, जो एक प्रक्रिया या कार्य के अंदरपरिभाषित क्लास है। यह क्लास के नाम के संदर्भ को उस दायरे के अंदरसीमित करता है जहां कक्षा घोषित की जाती है। भाषा के सिमेंटिक नियमों के आधार पर, स्थानीय क्लासों पर गैर-स्थानीय लोगों की तुलना में अतिरिक्त प्रतिबंध हो सकते हैं। एक सामान्य प्रतिबंध स्थानीय क्लास विधियों को संलग्न कार्य के स्थानीय वेरीएबल तक पहुँचने के लिए अस्वीकार करना है। उदाहरण के लिए, C ++ में, एक स्थानीय क्लास अपने संलग्न कार्य के अंदरघोषित स्थिर वेरीएबल को संदर्भित कर सकता है, लेकिन फ़ंक्शन के [[स्वचालित चर|स्वचालित वेरीएबल]] तक नहीं पहुंच सकता है।<ref>{{cite web | url=http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr062.htm | title=Local classes (C++ only) | work=XL C/C++ V8.0 for AIX | publisher=IBM | access-date=2012-05-07
}}
}}
</ref>
</ref>
Line 155: Line 155:
=== मेटाक्लास ===
=== मेटाक्लास ===
{{Main|Metaclass}}
{{Main|Metaclass}}
मेटाक्लास वे वर्ग हैं जिनके उदाहरण वर्ग हैं।{{sfn|Booch|1994|p=133-134}} एक मेटाक्लास कक्षाओं के संग्रह की एक सामान्य संरचना का वर्णन करता है और एक डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) को लागू कर सकता है या विशेष प्रकार की कक्षाओं का वर्णन कर सकता है। सॉफ्टवेयर ढांचे का वर्णन करने के लिए अक्सर मेटाक्लास का उपयोग किया जाता है।<ref>{{Cite web|url=http://pharo.gforge.inria.fr/PBE1/PBE1ch14.html|title=13 Classes and metaclasses|website=pharo.gforge.inria.fr|access-date=2016-10-31}}</ref>
मेटाक्लास वे क्लास हैं जिनके उदाहरण क्लास हैं।{{sfn|Booch|1994|p=133-134}} एक मेटाक्लास क्लासेस के संग्रह की एक सामान्य संरचना का वर्णन करता है और एक डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) को प्रयुक्त कर सकता है या विशेष प्रकार की क्लासेस का वर्णन कर सकता है। सॉफ्टवेयर ढांचे का वर्णन करने के लिए प्रायः मेटाक्लास का उपयोग किया जाता है।<ref>{{Cite web|url=http://pharo.gforge.inria.fr/PBE1/PBE1ch14.html|title=13 Classes and metaclasses|website=pharo.gforge.inria.fr|access-date=2016-10-31}}</ref>
कुछ भाषाओं में, जैसे कि पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा) या स्मॉलटाक, एक वर्ग भी एक वस्तु है; इस प्रकार प्रत्येक वर्ग एक अद्वितीय मेटाक्लास का एक उदाहरण है जिसे भाषा में बनाया गया है।
कुछ भाषाओं में, जैसे कि पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा) या स्मॉलटाक, एक क्लास भी एक वस्तु है; इस प्रकार प्रत्येक क्लास एक अद्वितीय मेटाक्लास का एक उदाहरण है जिसे भाषा में बनाया गया है।
<ref name="pythondata model" />
<ref name="pythondata model" />
<ref>{{cite web | url=http://www.ruby-doc.org/docs/ProgrammingRuby/html/classes.html | title=Classes and Objects | work=Programming Ruby: The Pragmatic Programmer's Guide | last1=Thomas | last2=Hunt | publisher=Ruby-Doc.org | access-date=2012-05-08}}
<ref>{{cite web | url=http://www.ruby-doc.org/docs/ProgrammingRuby/html/classes.html | title=Classes and Objects | work=Programming Ruby: The Pragmatic Programmer's Guide | last1=Thomas | last2=Hunt | publisher=Ruby-Doc.org | access-date=2012-05-08}}
</ref>
</ref>
{{sfn|Booch|1994|p=134}}
{{sfn|Booch|1994|p=134}}
[[कॉमन लिस्प ऑब्जेक्ट सिस्टम]] (सीएलओएस) उन वर्गों और मेटाक्लासेस को लागू करने के लिए [[मेटाऑब्जेक्ट]] (एमओपी) प्रदान करता है।
[[कॉमन लिस्प ऑब्जेक्ट सिस्टम]] (सीएलओएस) उन क्लासों और मेटाक्लासेस को प्रयुक्त करने के लिए [[मेटाऑब्जेक्ट]] (एमओपी) प्रदान करता है।
<ref>{{cite web | url=http://www.alu.org/mop/concepts.html#introduction | title=MOP: Concepts | work=The Common Lisp Object System MetaObject Protocol | publisher=Association of Lisp Users | access-date=2012-05-08 | archive-url=https://web.archive.org/web/20101115095930/http://www.alu.org/mop/concepts.html#introduction | archive-date=2010-11-15 | url-status=dead }}</ref>
<ref>{{cite web | url=http://www.alu.org/mop/concepts.html#introduction | title=MOP: Concepts | work=The Common Lisp Object System MetaObject Protocol | publisher=Association of Lisp Users | access-date=2012-05-08 | archive-url=https://web.archive.org/web/20101115095930/http://www.alu.org/mop/concepts.html#introduction | archive-date=2010-11-15 | url-status=dead }}</ref>




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


वर्ग को घोषित करके एक गैर-उपवर्गीय वर्ग बनाया जाता है {{code|sealed|lang=csharp}} सी # या के रूप में {{code|final|lang=java}} जावा या PHP में।<ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/ms173149.aspx | title=sealed (C# Reference) | work=C# Reference | publisher=Microsoft | access-date=2012-05-08}}
क्लास को घोषित करके एक गैर-उपक्लासीय क्लास बनाया जाता है {{code|sealed|lang=csharp}} सी # या के रूप में {{code|final|lang=java}} जावा या PHP में।<ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/ms173149.aspx | title=sealed (C# Reference) | work=C# Reference | publisher=Microsoft | access-date=2012-05-08}}
</ref><ref>{{cite web | url=http://docs.oracle.com/javase/tutorial/java/IandI/final.html | title=Writing Final Classes and Methods | work=The Java Tutorials | publisher=Oracle | access-date=2012-05-08}}
</ref><ref>{{cite web | url=http://docs.oracle.com/javase/tutorial/java/IandI/final.html | title=Writing Final Classes and Methods | work=The Java Tutorials | publisher=Oracle | access-date=2012-05-08}}
</ref><ref>{{cite web | url=http://php.net/manual/en/language.oop5.final.php | title=PHP: Final Keyword | work=PHP Manual | publisher=The PHP Group | access-date=2014-08-21}}
</ref><ref>{{cite web | url=http://php.net/manual/en/language.oop5.final.php | title=PHP: Final Keyword | work=PHP Manual | publisher=The PHP Group | access-date=2014-08-21}}
</ref> उदाहरण के लिए, जावा {{Java|String}} वर्ग को अंतिम के रूप में नामित किया गया है।<ref>{{cite web | url=http://docs.oracle.com/javase/7/docs/api/java/lang/String.html | title=String (Java Platform SE 7) | work=Java Platform, Standard Edition 7: API Specification | publisher=Oracle | access-date=2012-05-08}}
</ref> उदाहरण के लिए, जावा {{Java|String}} क्लास को अंतिम के रूप में नामित किया गया है।<ref>{{cite web | url=http://docs.oracle.com/javase/7/docs/api/java/lang/String.html | title=String (Java Platform SE 7) | work=Java Platform, Standard Edition 7: API Specification | publisher=Oracle | access-date=2012-05-08}}
</ref>
</ref>
गैर-उपवर्गीय वर्ग एक संकलक (संकलित भाषाओं में) को अनुकूलन करने की अनुमति दे सकते हैं जो उपवर्गीय वर्गों के लिए उपलब्ध नहीं हैं। <ref>{{cite web |last1=Brand |first1=Sy |title=The Performance Benefits of Final Classes |url=https://devblogs.microsoft.com/cppblog/the-performance-benefits-of-final-classes/ |website=Microsoft C++ team blog |date=2 March 2020 |publisher=Microsoft |access-date=4 April 2020}}</ref>
गैर-उपक्लासीय क्लास एक संकलक (संकलित भाषाओं में) को अनुकूलन करने की अनुमति दे सकते हैं जो उपक्लासीय क्लासों के लिए उपलब्ध नहीं हैं। <ref>{{cite web |last1=Brand |first1=Sy |title=The Performance Benefits of Final Classes |url=https://devblogs.microsoft.com/cppblog/the-performance-benefits-of-final-classes/ |website=Microsoft C++ team blog |date=2 March 2020 |publisher=Microsoft |access-date=4 April 2020}}</ref>
<!-- The following goes without saying, i.e., it says nothing but to hint that "abstract" and "concrete" are an "either but not both" concept. 'abstract' and 'concrete' are defined already above.-->
<!-- The following goes without saying, i.e., it says nothing but to hint that "abstract" and "concrete" are an "either but not both" concept. 'abstract' and 'concrete' are defined already above.-->
<!-- While it is impossible in any object-oriented language to have a class that is both abstract and concrete, -->
<!-- While it is impossible in any object-oriented language to have a class that is both abstract and concrete, -->
Line 183: Line 183:


=== खुली कक्षा ===
=== खुली कक्षा ===
एक खुली कक्षा वह है जिसे बदला जा सकता है। आमतौर पर, एक निष्पादन योग्य प्रोग्राम को ग्राहकों द्वारा नहीं बदला जा सकता है। डेवलपर्स अक्सर कुछ वर्गों को बदल सकते हैं, लेकिन आमतौर पर मानक या बिल्ट-इन वाले नहीं बदल सकते हैं। रूबी (प्रोग्रामिंग लैंग्वेज) #ओपन क्लासेस में, सभी क्लासेस ओपन होती हैं। पायथन (प्रोग्रामिंग भाषा) में, कक्षाएं रनटाइम पर बनाई जा सकती हैं, और बाद में सभी को संशोधित किया जा सकता है।<ref>{{cite web|title=9. Classes|url=https://docs.python.org/3.3/tutorial/classes.html|website=The Python Tutorial|publisher=Python.org|access-date=3 March 2018|quote=As is true for modules, classes partake of the dynamic nature of Python: they are created at runtime, and can be modified further after creation.}}</ref> ऑब्जेक्टिव-सी # कैटेगरीज | ऑब्जेक्टिव-सी श्रेणियां प्रोग्रामर को उस क्लास को फिर से कंपाइल करने या यहां तक ​​​​कि उसके सोर्स कोड तक पहुंच की आवश्यकता के बिना किसी मौजूदा क्लास में तरीके जोड़ने की अनुमति देती हैं।
एक खुली कक्षा वह है जिसे बदला जा सकता है। सामान्य रूप से, एक निष्पादन योग्य प्रोग्राम को ग्राहकों द्वारा नहीं बदला जा सकता है। डेवलपर्स प्रायः कुछ क्लासों को बदल सकते हैं, लेकिन सामान्य रूप से मानक या बिल्ट-इन वाले नहीं बदल सकते हैं। रूबी (प्रोग्रामिंग भाषा) #ओपन क्लासेस में, सभी क्लासेस ओपन होती हैं। पायथन (प्रोग्रामिंग भाषा) में, क्लासेस रनटाइम पर बनाई जा सकती हैं, और बाद में सभी को संशोधित किया जा सकता है।<ref>{{cite web|title=9. Classes|url=https://docs.python.org/3.3/tutorial/classes.html|website=The Python Tutorial|publisher=Python.org|access-date=3 March 2018|quote=As is true for modules, classes partake of the dynamic nature of Python: they are created at runtime, and can be modified further after creation.}}</ref> ऑब्जेक्टिव-सी # कैटेगरीज | ऑब्जेक्टिव-सी श्रेणियां प्रोग्रामर को उस क्लास को फिर से कंपाइल करने या यहां तक ​​​​कि उसके सोर्स कोड तक पहुंच की आवश्यकता के बिना किसी सम्मिलिता क्लास में तरीके जोड़ने की अनुमति देती हैं।


=== मिश्रण ===
=== मिश्रण ===
कुछ भाषाओं में मिश्रणों के लिए विशेष समर्थन होता है, हालांकि किसी भी भाषा में एकाधिक वंशानुक्रम के साथ एक मिश्रण केवल एक वर्ग है जो एक प्रकार के संबंध का प्रतिनिधित्व नहीं करता है। [[mixin]]्स का उपयोग आमतौर पर एक ही तरीके को कई वर्गों में जोड़ने के लिए किया जाता है; उदाहरण के लिए, एक वर्ग {{Mono|UnicodeConversionMixin}} नामक विधि प्रदान कर सकता है {{Mono|unicode_to_ascii}} जब कक्षाओं में शामिल किया गया {{Mono|FileReader}} और {{Mono|WebPageScraper}} जो एक सामान्य माता-पिता को साझा नहीं करते हैं।
कुछ भाषाओं में मिश्रणों के लिए विशेष समर्थन होता है, हालांकि किसी भी भाषा में एकाधिक वंशानुक्रम के साथ एक मिश्रण केवल एक क्लास है जो एक प्रकार के संबंध का प्रतिनिधित्व नहीं करता है। [[mixin]]्स का उपयोग सामान्य रूप से एक ही तरीके को कई क्लासों में जोड़ने के लिए किया जाता है; उदाहरण के लिए, एक क्लास {{Mono|UnicodeConversionMixin}} नामक विधि प्रदान कर सकता है {{Mono|unicode_to_ascii}} जब क्लासेस में सम्मिलित किया गया {{Mono|FileReader}} और {{Mono|WebPageScraper}} जो एक सामान्य माता-पिता को साझा नहीं करते हैं।


=== आंशिक ===
=== आंशिक ===
{{Unreferenced section|date=April 2012}}
{{Unreferenced section|date=April 2012}}
सुविधा का समर्थन करने वाली भाषाओं में, एक आंशिक वर्ग एक ऐसा वर्ग है जिसकी परिभाषा को एक ही स्रोत कोड|स्रोत-कोड फ़ाइल या एकाधिक फ़ाइलों में कई टुकड़ों में विभाजित किया जा सकता है।<ref name="mspartial">{{Citation|url=https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods|title=Partial Classes and Methods|work=C# Programming Guide|date=2015-09-19|author1=mairaw|author2=BillWagner|author3=tompratt-AQ|publisher=Microsoft|access-date=2018-08-08}}</ref> टुकड़ों को संकलन-समय पर विलय कर दिया जाता है, जिससे कंपाइलर आउटपुट एक गैर-आंशिक वर्ग के समान हो जाता है।
सुविधा का समर्थन करने वाली भाषाओं में, एक आंशिक क्लास एक ऐसा क्लास है जिसकी परिभाषा को एक ही स्रोत कोड|स्रोत-कोड फ़ाइल या एकाधिक फ़ाइलों में कई टुकड़ों में विभाजित किया जा सकता है।<ref name="mspartial">{{Citation|url=https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods|title=Partial Classes and Methods|work=C# Programming Guide|date=2015-09-19|author1=mairaw|author2=BillWagner|author3=tompratt-AQ|publisher=Microsoft|access-date=2018-08-08}}</ref> टुकड़ों को संकलन-समय पर विलय कर दिया जाता है, जिससे कंपाइलर आउटपुट एक गैर-आंशिक क्लास के समान हो जाता है।


आंशिक कक्षाओं की शुरूआत के लिए प्राथमिक प्रेरणा [[दृश्य डिजाइनर]]ों जैसे [[स्वचालित प्रोग्रामिंग]] के कार्यान्वयन की सुविधा प्रदान करना है।<ref name="mspartial"/>अन्यथा कोड जेनरेटर विकसित करना एक चुनौती या समझौता है जो डेवलपर-लिखित कोड के भीतर इंटरलीव किए जाने पर उत्पन्न कोड को प्रबंधित कर सकता है। आंशिक कक्षाओं का उपयोग करते हुए, एक कोड जनरेटर एक फ़ाइल के भीतर एक अलग फ़ाइल या मोटे अनाज वाले आंशिक वर्ग को संसाधित कर सकता है, और इस प्रकार व्यापक पार्सिंग के माध्यम से उत्पन्न कोड को जटिल रूप से इंटरजेक्ट करने से कम किया जाता है, संकलक दक्षता में वृद्धि और डेवलपर कोड को दूषित करने के संभावित जोखिम को समाप्त करता है। आंशिक कक्षाओं के एक सरल कार्यान्वयन में, संकलक [[पूर्वसंकलन]] का एक चरण कर सकता है जहां यह आंशिक वर्ग के सभी भागों को एकीकृत करता है। फिर, संकलन हमेशा की तरह आगे बढ़ सकता है।
आंशिक क्लासेस की शुरूआत के लिए प्राथमिक प्रेरणा [[दृश्य डिजाइनर]]ों जैसे [[स्वचालित प्रोग्रामिंग]] के कार्यान्वयन की सुविधा प्रदान करना है।<ref name="mspartial"/>अन्यथा कोड जेनरेटर विकसित करना एक चुनौती या समझौता है जो डेवलपर-लिखित कोड के अंदरइंटरलीव किए जाने पर उत्पन्न कोड को प्रबंधित कर सकता है। आंशिक क्लासेस का उपयोग करते हुए, एक कोड जनरेटर एक फ़ाइल के अंदरएक अलग फ़ाइल या मोटे अनाज वाले आंशिक क्लास को संसाधित कर सकता है, और इस प्रकार व्यापक पार्सिंग के माध्यम से उत्पन्न कोड को जटिल रूप से इंटरजेक्ट करने से कम किया जाता है, संकलक दक्षता में वृद्धि और डेवलपर कोड को दूषित करने के संभावित जोखिम को समाप्त करता है। आंशिक क्लासेस के एक सरल कार्यान्वयन में, संकलक [[पूर्वसंकलन]] का एक वेरीएबलण कर सकता है जहां यह आंशिक क्लास के सभी भागों को एकीकृत करता है। फिर, संकलन हमेशा की तरह आगे बढ़ सकता है।


आंशिक वर्ग सुविधा के अन्य लाभों और प्रभावों में शामिल हैं:
आंशिक क्लास सुविधा के अन्य लाभों और प्रभावों में सम्मिलित हैं:


* एक वर्ग के इंटरफेस और कार्यान्वयन कोड को एक अनोखे तरीके से अलग करने में सक्षम बनाता है।
* एक क्लास के इंटरफेस और कार्यान्वयन कोड को एक अनोखे तरीके से अलग करने में सक्षम बनाता है।
* एक [[स्रोत कोड संपादक]] के भीतर बड़ी कक्षाओं के माध्यम से नेविगेशन को आसान बनाता है।
* एक [[स्रोत कोड संपादक]] के अंदरबड़ी क्लासेस के माध्यम से नेविगेशन को आसान बनाता है।
* पहलू-उन्मुख प्रोग्रामिंग के समान, लेकिन बिना किसी अतिरिक्त टूल का उपयोग किए, चिंताओं को अलग करने में सक्षम बनाता है।
* रूपरूप-उन्मुख प्रोग्रामिंग के समान, लेकिन बिना किसी अतिरिक्त टूल का उपयोग किए, चिंताओं को अलग करने में सक्षम बनाता है।
* कई डेवलपर्स को बाद में एक फ़ाइल में अलग-अलग कोड मर्ज करने की आवश्यकता के बिना समवर्ती रूप से एक ही वर्ग पर काम करने में सक्षम बनाता है। <!-- (This enabling may be considered by some or most to be a detriment rather than a benefit for SoC can apply to programmers also).-->
* कई डेवलपर्स को बाद में एक फ़ाइल में अलग-अलग कोड मर्ज करने की आवश्यकता के बिना समवर्ती रूप से एक ही क्लास पर काम करने में सक्षम बनाता है।<!-- (This enabling may be considered by some or most to be a detriment rather than a benefit for SoC can apply to programmers also).-->
स्मॉलटाक में क्लास एक्सटेंशन के नाम से आंशिक कक्षाएं काफी समय से मौजूद हैं। .NET Framework|.NET Framework 2 के आगमन के साथ, [[Microsoft]] ने C Sharp (प्रोग्रामिंग भाषा)|C# 2.0 और Visual Basic .NET दोनों में समर्थित आंशिक कक्षाओं की शुरुआत की। [[WinRT]] भी आंशिक कक्षाओं का समर्थन करता है।
स्मॉलटाक में क्लास एक्सटेंशन के नाम से आंशिक क्लासेस काफी समय से सम्मिलित हैं। .NET Framework|.NET Framework 2 के आगमन के साथ, [[Microsoft]] ने C Sharp (प्रोग्रामिंग भाषा)|C# 2.0 और Visual Basic .NET दोनों में समर्थित आंशिक क्लासेस की शुरुआत की। [[WinRT]] भी आंशिक क्लासेस का समर्थन करता है।


==== VB.NET में उदाहरण ====
==== VB.NET में उदाहरण ====
विजुअल बेसिक .NET में लिखा गया यह सरल उदाहरण दिखाता है कि एक ही वर्ग के भागों को दो अलग-अलग फाइलों में कैसे परिभाषित किया जाता है।
विजुअल बेसिक .NET में लिखा गया यह सरल उदाहरण दिखाता है कि एक ही क्लास के भागों को दो अलग-अलग फाइलों में कैसे परिभाषित किया जाता है।
फ़ाइल1.वीबी:
फ़ाइल1.वीबी:
<वाक्यविन्यास लैंग = vbnet>
<वाक्यविन्यास लैंग = vbnet>
आंशिक वर्ग MyClass
आंशिक क्लास MyClass
     निजी _नाम स्ट्रिंग के रूप में
     निजी _नाम स्ट्रिंग के रूप में
अंत वर्ग
अंत क्लास
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
फ़ाइल 2.वीबी:
फ़ाइल 2.वीबी:
<वाक्यविन्यास लैंग = vbnet>
<वाक्यविन्यास लैंग = vbnet>
आंशिक वर्ग MyClass
आंशिक क्लास MyClass
     सार्वजनिक रीडोनली संपत्ति का नाम () स्ट्रिंग के रूप में
     सार्वजनिक रीडोनली संपत्ति का नाम () स्ट्रिंग के रूप में
         पाना
         पाना
Line 218: Line 218:
         अंत प्राप्त करें
         अंत प्राप्त करें
     संपत्ति समाप्त करें
     संपत्ति समाप्त करें
अंत वर्ग
अंत क्लास
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
संकलित होने पर, परिणाम वही होता है जैसे दो फाइलें एक के रूप में लिखी जाती हैं, जैसे:
संकलित होने पर, परिणाम वही होता है जैसे दो फाइलें एक के रूप में लिखी जाती हैं, जैसे:
Line 229: Line 229:
         अंत प्राप्त करें
         अंत प्राप्त करें
     संपत्ति समाप्त करें
     संपत्ति समाप्त करें
अंत वर्ग
अंत क्लास
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


==== [[उद्देश्य सी]] में उदाहरण ====
==== [[उद्देश्य सी]] में उदाहरण ====
उद्देश्य-सी में, आंशिक कक्षाएं, जिन्हें श्रेणियों के रूप में भी जाना जाता है, निम्न उदाहरणों की तरह कई पुस्तकालयों और निष्पादनयोग्य में भी फैल सकती हैं। लेकिन एक महत्वपूर्ण अंतर यह है कि ऑब्जेक्टिव-सी की श्रेणियां अन्य इंटरफ़ेस घोषणा में परिभाषाओं को अधिलेखित कर सकती हैं, और ये श्रेणियां मूल वर्ग परिभाषा के बराबर नहीं हैं (पहले को अंतिम की आवश्यकता होती है)।<ref name="appleCategories">{{citation|url=https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW1|title=Customizing Existing Classes|work=Programming with Objective-C|date=2014-09-17|author=Apple|publisher=Apple|access-date=2018-08-08}}</ref> इसके बजाय, .NET आंशिक वर्ग में परस्पर विरोधी परिभाषाएँ नहीं हो सकती हैं, और सभी आंशिक परिभाषाएँ अन्य के बराबर हैं।<ref name="mspartial"/>
उद्देश्य-सी में, आंशिक क्लासेस, जिन्हें श्रेणियों के रूप में भी जाना जाता है, निम्न उदाहरणों की तरह कई पुस्तकालयों और निष्पादनयोग्य में भी फैल सकती हैं। लेकिन एक महत्वपूर्ण अंतर यह है कि ऑब्जेक्टिव-सी की श्रेणियां अन्य इंटरफ़ेस घोषणा में परिभाषाओं को अधिलेखित कर सकती हैं, और ये श्रेणियां मूल क्लास परिभाषा के बराबर नहीं हैं (पहले को अंतिम की आवश्यकता होती है)।<ref name="appleCategories">{{citation|url=https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW1|title=Customizing Existing Classes|work=Programming with Objective-C|date=2014-09-17|author=Apple|publisher=Apple|access-date=2018-08-08}}</ref> इसके अतिरिक्त, .NET आंशिक क्लास में परस्पर विरोधी परिभाषाएँ नहीं हो सकती हैं, और सभी आंशिक परिभाषाएँ अन्य के बराबर हैं।<ref name="mspartial"/>


फाउंडेशन में, हेडर फ़ाइल NSData.h:
फाउंडेशन में, हेडर फ़ाइल NSData.h:
Line 244: Line 244:
@अंत
@अंत
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
उपयोगकर्ता द्वारा आपूर्ति की गई लाइब्रेरी में, फाउंडेशन फ्रेमवर्क से एक अलग बाइनरी, हेडर फाइल NSData+base64.h:
उपयोगकर्ता द्वारा आपूर्ति की गई लाइब्रेरी में, फाउंडेशन रूपरेखा से एक अलग बाइनरी, हेडर फाइल NSData+base64.h:
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>
#आयात <फाउंडेशन/फाउंडेशन.एच>
#आयात <फाउंडेशन/फाउंडेशन.एच>
Line 270: Line 270:
}
}
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
डिस्पैचर NSData इंस्टेंस पर बुलाए गए दोनों तरीकों को ढूंढेगा और दोनों को सही तरीके से इनवॉइस करेगा।
डिस्पैवेरीएबल NSData इंस्टेंस पर बुलाए गए दोनों तरीकों को ढूंढेगा और दोनों को सही तरीके से इनवॉइस करेगा।


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


उदाहरण के लिए, सी # में, स्थिर चिह्नित वर्ग को तत्काल नहीं किया जा सकता है, केवल स्थिर सदस्य (फ़ील्ड, विधियों, अन्य) हो सकते हैं, हो सकता है कि 'इंस्टेंस कन्स्ट्रक्टर' न हो, और '' मुहरबंद '' हो।
उदाहरण के लिए, सी # में, स्थिर चिह्नित क्लास को तत्काल नहीं किया जा सकता है, केवल स्थिर सदस्य (क्षेत्र, विधियों, अन्य) हो सकते हैं, हो सकता है कि 'इंस्टेंस कन्स्ट्रक्टर' न हो, और '' मुहरबंद '' हो।
<ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.100).aspx | title=Static Classes and Static Class Members (C# Programming Guide) | work=C# Programming Guide | publisher=Microsoft | access-date=2012-05-08}}
<ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.100).aspx | title=Static Classes and Static Class Members (C# Programming Guide) | work=C# Programming Guide | publisher=Microsoft | access-date=2012-05-08}}
</ref>
</ref>
Line 281: Line 281:


=== अनाम ===
=== अनाम ===
एक अनाम वर्ग या अनाम वर्ग एक ऐसा वर्ग है जो परिभाषा पर किसी नाम या पहचानकर्ता के लिए बाध्य नहीं है।<ref>{{Cite web|title=Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)|url=https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html|access-date=2021-05-13|website=docs.oracle.com}}</ref><ref>{{Cite web|title=PHP: Anonymous classes - Manual|url=https://www.php.net/manual/en/language.oop5.anonymous.php|access-date=2021-08-11|website=www.php.net}}</ref> यह नामांकित बनाम अज्ञात फ़ंक्शन के अनुरूप है।
एक अनाम क्लास या अनाम क्लास एक ऐसा क्लास है जो परिभाषा पर किसी नाम या पहचानकर्ता के लिए बाध्य नहीं है।<ref>{{Cite web|title=Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)|url=https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html|access-date=2021-05-13|website=docs.oracle.com}}</ref><ref>{{Cite web|title=PHP: Anonymous classes - Manual|url=https://www.php.net/manual/en/language.oop5.anonymous.php|access-date=2021-08-11|website=www.php.net}}</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>
सॉफ़्टवेयर को वस्तु क्लासों में व्यवस्थित करने के लाभ तीन श्रेणियों में आते हैं:<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 book|last=Booch|first=Grady|title=Object-Oriented Analysis and Design with Applications|publisher=Addison-Wesley Professional|isbn=978-0-201-89551-3|pages=1–28|url=http://my.safaribooksonline.com/book/software-engineering-and-development/object/9780201895513|author2=Robert A. Maksimchuk |author3=Michael W. Engle |author4=Bobbi J. Young Ph.D. |author5=Jim Conallen |author6= Kelli A. Houston |access-date=20 December 2013|date=April 30, 2007|quote=There are fundamental limiting factors of human cognition; we can address these constraints through the use of decomposition, abstraction, and hierarchy.}}</ref>
वस्तु क्लास तेजी से विकास की सुविधा प्रदान करते हैं क्योंकि वे कोड और उपयोगकर्ताओं के बीच शब्दार्थ अंतर को कम करते हैं। सिस्टम विश्लेषक खातों, ग्राहकों, बिलों आदि के बारे में बात करते हुए अनिवार्य रूप से समान शब्दावली का उपयोग करके डेवलपर्स और उपयोगकर्ताओं दोनों से बात कर सकते हैं। ऑब्जेक्ट क्लास प्रायः तेजी से विकास की सुविधा प्रदान करते हैं क्योंकि अधिकांश वस्तु-उन्मुख वातावरण शक्तिशाली डिबगिंग और परीक्षण टूल के साथ आते हैं। यह सत्यापित करने के लिए कि सिस्टम अपेक्षित रूप से प्रदर्शन कर रहा है, क्लासेस के उदाहरणों को रन टाइम पर निरीक्षण किया जा सकता है। इसके अलावा, कोर मेमोरी के डंप होने के अतिरिक्त, अधिकांश वस्तु-उन्मुख वातावरणों ने डिबगिंग क्षमताओं की व्याख्या की है ताकि डेवलपर ठीक से विश्लेषण कर सके कि प्रोग्राम में त्रुटि कहां हुई और यह देख सके कि कौन से तरीकों को किस तर्क और किस तर्क के साथ बुलाया गया था।<ref>{{cite book|last=Booch|first=Grady|title=Object-Oriented Analysis and Design with Applications|publisher=Addison-Wesley Professional|isbn=978-0-201-89551-3|pages=1–28|url=http://my.safaribooksonline.com/book/software-engineering-and-development/object/9780201895513|author2=Robert A. Maksimchuk |author3=Michael W. Engle |author4=Bobbi J. Young Ph.D. |author5=Jim Conallen |author6= Kelli A. Houston |access-date=20 December 2013|date=April 30, 2007|quote=There are fundamental limiting factors of human cognition; we can address these constraints through the use of decomposition, abstraction, and hierarchy.}}</ref>
ऑब्जेक्ट क्लास इनकैप्सुलेशन के माध्यम से रखरखाव में आसानी की सुविधा प्रदान करते हैं। जब डेवलपर्स को किसी वस्तु के व्यवहार को बदलने की आवश्यकता होती है, तो वे परिवर्तन को केवल उस वस्तु और उसके घटक भागों में स्थानांतरित कर सकते हैं। यह रखरखाव संवर्द्धन से अवांछित दुष्प्रभावों की संभावना को कम करता है।
ऑब्जेक्ट क्लास इनकैप्सुलेशन के माध्यम से रखरखाव में आसानी की सुविधा प्रदान करते हैं। जब डेवलपर्स को किसी वस्तु के व्यवहार को बदलने की आवश्यकता होती है, तो वे परिवर्तन को केवल उस वस्तु और उसके घटक भागों में स्थानांतरित कर सकते हैं। यह रखरखाव संवर्द्धन से अवांछित दुष्प्रभावों की संभावना को कम करता है।


सॉफ़्टवेयर का पुन: उपयोग भी ऑब्जेक्ट क्लास का उपयोग करने का एक प्रमुख लाभ है। कक्षाएं वंशानुक्रम और इंटरफेस के माध्यम से पुन: उपयोग की सुविधा प्रदान करती हैं। जब एक नए व्यवहार की आवश्यकता होती है, तो इसे अक्सर एक नया वर्ग बनाकर प्राप्त किया जा सकता है और उस वर्ग को उसके सुपरक्लास के डिफ़ॉल्ट व्यवहार और डेटा को विरासत में मिला कर व्यवहार या डेटा के कुछ पहलू को उसके अनुरूप बनाया जा सकता है। इंटरफेस के माध्यम से पुन: उपयोग (तरीकों के रूप में भी जाना जाता है) तब होता है जब कोई अन्य ऑब्जेक्ट किसी ऑब्जेक्ट क्लास को आमंत्रित करना चाहता है (नए प्रकार का बनाने के बजाय)। पुन: उपयोग के लिए यह विधि कई सामान्य त्रुटियों को दूर करती है जो सॉफ़्टवेयर में अपना रास्ता बना सकती हैं जब एक प्रोग्राम दूसरे से कोड का पुन: उपयोग करता है।<ref>{{cite book|last=Jacobsen|first=Ivar|title=Object Oriented Software Engineering|year=1992|publisher=Addison-Wesley ACM Press|isbn=0-201-54435-0|author2=Magnus Christerson|author3=Patrik Jonsson|author4=Gunnar Overgaard|url=https://archive.org/details/objectorientedso00jaco}}</ref>
सॉफ़्टवेयर का पुन: उपयोग भी ऑब्जेक्ट क्लास का उपयोग करने का एक प्रमुख लाभ है। क्लासेस वंशानुक्रम और इंटरफेस के माध्यम से पुन: उपयोग की सुविधा प्रदान करती हैं। जब एक नए व्यवहार की आवश्यकता होती है, तो इसे प्रायः एक नया क्लास बनाकर प्राप्त किया जा सकता है और उस क्लास को उसके सुपरक्लास के डिफ़ॉल्ट व्यवहार और डेटा को विरासत में मिला कर व्यवहार या डेटा के कुछ रूपरूप को उसके अनुरूप बनाया जा सकता है। इंटरफेस के माध्यम से पुन: उपयोग (तरीकों के रूप में भी जाना जाता है) तब होता है जब कोई अन्य ऑब्जेक्ट किसी ऑब्जेक्ट क्लास को आमंत्रित करना चाहता है (नए प्रकार का बनाने के अतिरिक्त)। पुन: उपयोग के लिए यह विधि कई सामान्य त्रुटियों को दूर करती है जो सॉफ़्टवेयर में अपना रास्ता बना सकती हैं जब एक प्रोग्राम दूसरे से कोड का पुन: उपयोग करता है।<ref>{{cite book|last=Jacobsen|first=Ivar|title=Object Oriented Software Engineering|year=1992|publisher=Addison-Wesley ACM Press|isbn=0-201-54435-0|author2=Magnus Christerson|author3=Patrik Jonsson|author4=Gunnar Overgaard|url=https://archive.org/details/objectorientedso00jaco}}</ref>




== रन-टाइम प्रतिनिधित्व ==
== रन-टाइम प्रतिनिधित्व ==
{{Unreferenced section|date=May 2012}}
{{Unreferenced section|date=May 2012}}
डेटा प्रकार के रूप में, एक वर्ग को आमतौर पर संकलन-समय के निर्माण के रूप में माना जाता है।<ref>{{cite web |title=C++ International standard |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf |archive-url=https://web.archive.org/web/20171209100334/http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/n4713.pdf |archive-date=2017-12-09 |url-status=live |website=Working Draft, Standard for Programming Language C++ |publisher=ISO/IEC JTC1/SC22 WG21 |access-date=5 January 2020}}</ref> एक भाषा या पुस्तकालय [[प्रोटोटाइप-आधारित प्रोग्रामिंग]] या [[फैक्टरी विधि पैटर्न]] मेटाऑब्जेक्ट्स का भी समर्थन कर सकता है जो कक्षाओं के बारे में रन-टाइम जानकारी का प्रतिनिधित्व करता है, या यहां तक ​​कि मेटाडेटा का प्रतिनिधित्व करता है जो [[प्रतिबिंब (कंप्यूटर विज्ञान)]] सुविधाओं तक पहुंच प्रदान करता है और रन-टाइम पर डेटा संरचना स्वरूपों में हेरफेर करने की क्षमता प्रदान करता है। . कई भाषाएँ कक्षाओं के बारे में इस तरह की [[रन-टाइम प्रकार की जानकारी]] को एक वर्ग से इस आधार पर अलग करती हैं कि रन-टाइम पर जानकारी की आवश्यकता नहीं होती है। कुछ गतिशील भाषाएँ रन-टाइम और कंपाइल-टाइम निर्माणों के बीच सख्त अंतर नहीं करती हैं, और इसलिए मेटाऑब्जेक्ट्स और कक्षाओं के बीच अंतर नहीं कर सकती हैं।
डेटा प्रकार के रूप में, एक क्लास को सामान्य रूप से संकलन-समय के निर्माण के रूप में माना जाता है।<ref>{{cite web |title=C++ International standard |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf |archive-url=https://web.archive.org/web/20171209100334/http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/n4713.pdf |archive-date=2017-12-09 |url-status=live |website=Working Draft, Standard for Programming Language C++ |publisher=ISO/IEC JTC1/SC22 WG21 |access-date=5 January 2020}}</ref> एक भाषा या पुस्तकालय [[प्रोटोटाइप-आधारित प्रोग्रामिंग]] या [[फैक्टरी विधि पैटर्न]] मेटाऑब्जेक्ट्स का भी समर्थन कर सकता है जो क्लासेस के बारे में रन-टाइम जानकारी का प्रतिनिधित्व करता है, या यहां तक ​​कि मेटाडेटा का प्रतिनिधित्व करता है जो [[प्रतिबिंब (कंप्यूटर विज्ञान)]] सुविधाओं तक पहुंच प्रदान करता है और रन-टाइम पर डेटा संरचना स्वरूपों में हेरफेर करने की क्षमता प्रदान करता है। . कई भाषाएँ क्लासेस के बारे में इस तरह की [[रन-टाइम प्रकार की जानकारी]] को एक क्लास से इस आधार पर अलग करती हैं कि रन-टाइम पर जानकारी की आवश्यकता नहीं होती है। कुछ गतिशील भाषाएँ रन-टाइम और कंपाइल-टाइम निर्माणों के बीच सख्त अंतर नहीं करती हैं, और इसलिए मेटाऑब्जेक्ट्स और क्लासेस के बीच अंतर नहीं कर सकती हैं।


उदाहरण के लिए, यदि मानव वर्ग व्यक्ति का प्रतिनिधित्व करने वाला एक मेटाऑब्जेक्ट है, तो मानव मेटाऑब्जेक्ट की सुविधाओं का उपयोग करके वर्ग व्यक्ति के उदाहरण बनाए जा सकते हैं।
उदाहरण के लिए, यदि मानव क्लास व्यक्ति का प्रतिनिधित्व करने वाला एक मेटाऑब्जेक्ट है, तो मानव मेटाऑब्जेक्ट की सुविधाओं का उपयोग करके क्लास व्यक्ति के उदाहरण बनाए जा सकते हैं।


== यह भी देखें ==
== यह भी देखें ==
Line 307: Line 307:
* [[वस्तु-उन्मुख प्रोग्रामिंग भाषाओं की सूची]]
* [[वस्तु-उन्मुख प्रोग्रामिंग भाषाओं की सूची]]
* मिक्सिन
* मिक्सिन
* ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
* वस्तु-उन्मुख प्रोग्रामिंग
* प्रोटोटाइप आधारित प्रोग्रामिंग
* प्रोटोटाइप आधारित प्रोग्रामिंग
* [[विशेषता (कंप्यूटर प्रोग्रामिंग)]]
* [[विशेषता (कंप्यूटर प्रोग्रामिंग)]]

Revision as of 22:42, 28 February 2023

वस्तु-उन्मुख प्रोग्रामिंग में, क्लास ऑब्जेक्ट (वस्तु-उन्मुख प्रोग्रामिंग) बनाने के लिए एक एक्स्टेंसिबल प्रोग्राम-कोड-टेम्प्लेट है, स्थिति (सदस्य वेरीएबल) के लिए प्रारंभिक मान प्रदान करता है और व्यवहार के कार्यान्वयन (सदस्य कार्य या विधि (कंप्यूटर प्रोग्रामिंग)) .[1][2] कई भाषाओं में, क्लास का नाम क्लास के नाम (स्वयं टेम्पलेट) के रूप में प्रयोग किया जाता है, क्लास के डिफ़ॉल्ट कंस्ट्रक्टर (वस्तु-उन्मुख प्रोग्रामिंग) के लिए नाम (एक सबरूटीन जो ऑब्जेक्ट बनाता है), और डेटा प्रकार के रूप में इंस्टेंस (कंप्यूटर विज्ञान) द्वारा उत्पन्न वस्तुओं की कक्षा; इन विशिष्ट अवधारणाओं को आसानी से सम्मिश्रित किया जाता है।[2] हालांकि, सम्मिश्रण के बिंदु पर, कोई तर्क दे सकता है कि इसकी बहुरूपी प्रकृति के कारण एक भाषा में निहित एक विशेषता है और क्यों ये भाषाएं इतनी शक्तिशाली, गतिशील और उपयोग के लिए अनुकूलनीय हैं, जो बिना बहुरूपता वाली भाषाओं की तुलना में सम्मिलित हैं। इस प्रकार वे डायनेमिक सिस्टम (यानी वास्तविक दुनिया, मशीन लर्निंग, एआई) को अधिक आसानी से मॉडल कर सकते हैं।

जब क्लास के कंस्ट्रक्टर द्वारा कोई ऑब्जेक्ट बनाया जाता है, तो परिणामी ऑब्जेक्ट को क्लास का एक इंस्टेंस (कंप्यूटर विज्ञान) कहा जाता है, और ऑब्जेक्ट के लिए विशिष्ट सदस्य वेरीएबल को उदाहरण वेरीएबल कहा जाता है, क्लास भर में साझा किए गए क्लास वेरीएबल्स के विपरीत .

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

कक्षा बनाम प्रकार

इसके सबसे आकस्मिक उपयोग में, लोग प्रायः किसी वस्तु के क्लास को संदर्भित करते हैं, लेकिन संकीर्ण रूप से बोलने वाली वस्तुओं का प्रकार होता है: इंटरफ़ेस, अर्थात् सदस्य वेरीएबल के प्रकार, सदस्य कार्यों (विधियों) के हस्ताक्षर, और ये गुण संतुष्ट करते हैं। उसी समय, एक क्लास का कार्यान्वयन (विशेष रूप से विधियों का कार्यान्वयन) होता है, और किसी दिए गए कार्यान्वयन के साथ दिए गए प्रकार की वस्तुओं को बना सकता है।[3] प्रकार सिद्धांत के संदर्भ में, एक क्लास एक कार्यान्वयन है‍—‌एक ठोस डेटा संरचना और सबरूटीन्स का संग्रह‍—‌जबकि एक प्रकार एक प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग) है। विभिन्न (ठोस) क्लास समान (सार) प्रकार की वस्तुओं का उत्पादन कर सकते हैं (प्रकार प्रणाली के आधार पर); उदाहरण के लिए, प्रकार Stack दो क्लासों के साथ प्रयुक्त किया जा सकता है – SmallStack (छोटे ढेर के लिए तेजी से, लेकिन खराब पैमाने पर) और ScalableStack (छोटे ढेर के लिए अच्छी तरह से लेकिन उच्च ओवरहेड)। इसी तरह, एक क्लास में कई अलग-अलग कंस्ट्रक्टर हो सकते हैं।

क्लास प्रकार सामान्य रूप से संज्ञाओं का प्रतिनिधित्व करते हैं, जैसे कि एक व्यक्ति, स्थान या चीज़, या कुछ नाममात्रीकरण, और एक क्लास इनके कार्यान्वयन का प्रतिनिधित्व करता है। उदाहरण के लिए, ए Banana प्रकार सामान्य रूप से केले के गुणों और कार्यक्षमता का प्रतिनिधित्व कर सकता है, जबकि ABCBanana और XYZBanana क्लासेस केले के उत्पादन के तरीकों का प्रतिनिधित्व करेंगी (जैसे, केले के आपूर्तिकर्ता या डेटा संरचनाएं और एक वीडियो गेम में केले का प्रतिनिधित्व करने और आकर्षित करने के लिए कार्य)। ABCBanana }} क्लास तब विशेष केले का उत्पादन कर सकता है: के उदाहरण ABCBanana क्लास प्रकार की वस्तुएं होंगी Banana. प्रायः एक प्रकार का केवल एक कार्यान्वयन दिया जाता है, इस स्थिति में क्लास का नाम प्रायः प्रकार के नाम के समान होता है।

डिजाइन और कार्यान्वयन

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

<स्पैन क्लास = एंकर आईडी = संपत्ति> संरचना

क्लासेस के लिए एकीकृत मॉडलिंग भाषा अंकन

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

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

व्यवहार

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


क्लास इंटरफ़ेस की अवधारणा

प्रत्येक क्लास #संरचना और व्यवहार प्रदान करके एक इंटरफ़ेस प्रयुक्त करता है (या महसूस करता है)। संरचना में डेटा और स्थिति होते हैं, और व्यवहार में कोड होते हैं जो निर्दिष्ट करते हैं कि विधियों को कैसे कार्यान्वित किया जाता है।[8] एक अंतरफलक की परिभाषा और उस अंतरफलक के कार्यान्वयन के बीच अंतर है; हालाँकि, यह रेखा कई प्रोग्रामिंग भाषाओं में धुंधली है क्योंकि क्लास घोषणाएँ एक इंटरफ़ेस को परिभाषित और कार्यान्वित करती हैं। हालाँकि, कुछ भाषाएँ ऐसी सुविधाएँ प्रदान करती हैं जो इंटरफ़ेस और कार्यान्वयन को अलग करती हैं। उदाहरण के लिए, एक #सार_और_कंक्रीट कार्यान्वयन प्रदान किए बिना एक इंटरफ़ेस को परिभाषित कर सकता है।

क्लास वंशानुक्रम का समर्थन करने वाली भाषाएँ भी क्लासेस को उन क्लासों से इंटरफेस प्राप्त करने की अनुमति देती हैं जिनसे वे प्राप्त हुए हैं।

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

उन भाषाओं में जो #जानकारी छिपाने और एनकैप्सुलेशन का समर्थन करती हैं, एक क्लास के इंटरफ़ेस को क्लास के सार्वजनिक सदस्यों का सेट माना जाता है, जिसमें विधियाँ और विशेषताएँ दोनों सम्मिलित हैं (अंतर्निहित म्यूटेटर विधि के माध्यम से); कोई भी निजी सदस्य या आंतरिक डेटा संरचना बाहरी द्वारा निर्भर होने का इरादा नहीं है कोड और इस प्रकार इंटरफ़ेस का हिस्सा नहीं हैं।

वस्तु-उन्मुख प्रोग्रामिंग पद्धति निर्देश देता है कि किसी क्लास के किसी भी इंटरफ़ेस का संचालन एक दूसरे से स्वतंत्र होना है। इसका परिणाम एक स्तरित डिज़ाइन में होता है जहाँ एक इंटरफ़ेस के क्लाइंट इंटरफ़ेस में घोषित विधियों का उपयोग करते हैं। एक इंटरफ़ेस क्लाइंट के लिए किसी विशेष क्रम में एक इंटरफ़ेस के संचालन को प्रयुक्त करने की कोई आवश्यकता नहीं रखता है। इस दृष्टिकोण का लाभ यह है कि क्लाइंट कोड यह मान सकता है कि जब भी क्लाइंट उपयोग के लिए इंटरफ़ेस के संचालन उपलब्ध होते हैं वस्तु तक पहुँच है।[9][citation needed]


उदाहरण

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

एक टेलीविज़न सेट में असंख्य विशेषताएं भी होती हैं, जैसे कि आकार और क्या यह रंग का समर्थन करता है, जो एक साथ मिलकर इसकी संरचना बनाते हैं। एक क्लास एक टेलीविजन के पूर्ण विवरण का प्रतिनिधित्व करता है, जिसमें इसकी विशेषताएँ (संरचना) और बटन (इंटरफ़ेस) सम्मिलित हैं।

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

सदस्य पहुंच

निम्नलिखित पहुँच विनिर्देशक का एक सामान्य सेट है:[10]

  • प्राइवेट (या क्लास-प्राइवेट) क्लास तक ही पहुँच को प्रतिबंधित करता है। केवल वही विधियाँ जो एक ही क्लास का हिस्सा हैं, निजी सदस्यों तक पहुँच सकती हैं।
  • संरक्षित (या क्लास-संरक्षित) क्लास को स्वयं और उसके सभी उपक्लासों को सदस्य तक पहुँचने की अनुमति देता है।
  • पब्लिक का तात्पर्य है कि कोई भी कोड सदस्य को उसके नाम से एक्सेस कर सकता है।

हालाँकि कई वस्तु-उन्मुख भाषाएँ उपरोक्त एक्सेस स्पेसिफायर का समर्थन करती हैं, उनके शब्दार्थ भिन्न हो सकते हैं।

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

एक्सेस विनिर्देशक आवश्यक रूप से दृश्यता को नियंत्रित नहीं करते हैं, इसमें निजी सदस्य भी क्लाइंट बाहरी कोड के लिए दृश्यमान हो सकते हैं। कुछ भाषाओं में, एक अप्राप्य लेकिन दृश्यमान सदस्य को रन-टाइम पर संदर्भित किया जा सकता है (उदाहरण के लिए, किसी सदस्य फ़ंक्शन से लौटाए गए सूचक द्वारा), लेकिन क्लाइंट कोड से सदस्य के नाम का संदर्भ देकर इसका उपयोग करने का प्रयास किया जाएगा टाइप चेकर द्वारा रोका गया।[11] विभिन्न वस्तु-उन्मुख प्रोग्रामिंग भाषा सदस्य की पहुंच और दृश्यता को विभिन्न डिग्री तक प्रयुक्त करती हैं, और भाषा के प्रकार सिस्टम और संकलन नीतियों के आधार पर, संकलन समय | कंपाइल-टाइम या रन टाइम (कार्यक्रम जीवनचक्र वेरीएबलण) | रन-टाइम पर प्रयुक्त होती हैं। उदाहरण के लिए, जावा (प्रोग्रामिंग भाषा) भाषा क्लाइंट कोड की अनुमति नहीं देती है जो किसी क्लास के निजी डेटा को कंपाइल करने के लिए एक्सेस करता है। [12] सी ++ भाषा में, निजी तरीके दिखाई देते हैं, लेकिन इंटरफ़ेस में पहुंच योग्य नहीं हैं; हालाँकि, उन्हें पूरी तरह से अमूर्त क्लासों को स्पष्ट रूप से घोषित करके अदृश्य बनाया जा सकता है जो कक्षा के इंटरफेस का प्रतिनिधित्व करते हैं।[13] कुछ भाषाओं में अन्य पहुँच-योग्यता योजनाएँ हैं:

  • इंस्टेंस बनाम क्लास एक्सेसिबिलिटी: रूबी (प्रोग्रामिंग भाषा) क्रमशः क्लास-प्राइवेट और क्लास-प्रोटेक्टेड के बदले इंस्टेंस-प्राइवेट और इंस्टेंस-प्रोटेक्टेड एक्सेस स्पेसिफायर का समर्थन करती है। वे इसमें भिन्न हैं कि वे उदाहरण के क्लास के अतिरिक्त उदाहरण के आधार पर ही पहुंच को प्रतिबंधित करते हैं।[14]
  • मित्र: सी ++ एक तंत्र का समर्थन करता है जहां स्पष्ट रूप से क्लास के मित्र कार्य के रूप में घोषित एक फ़ंक्शन निजी या संरक्षित के रूप में नामित सदस्यों तक पहुंच सकता है।[15]
  • पथ-आधारित: जावा एक जावा सिंटैक्स # एक्सेस संशोधक के अंदरएक सदस्य तक पहुंच को प्रतिबंधित करने का समर्थन करता है, जो फ़ाइल का तार्किक पथ है। हालाँकि, संरक्षित सदस्यों तक पहुँचने के लिए रूपरेखा क्लास के समान पैकेज में क्लासेस को प्रयुक्त करने के लिए जावा रूपरेखा का विस्तार करना एक सामान्य अभ्यास है। स्रोत फ़ाइल पूरी तरह से अलग स्थान पर सम्मिलित हो सकती है, और एक अलग .jar फ़ाइल में तैनात की जा सकती है, फिर भी जहाँ तक JVM का संबंध है, उसी तार्किक पथ में हो।[10]


अंतर-क्लास संबंध

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

रचना

क्लासेस को अन्य क्लासों से बनाया जा सकता है, जिससे संलग्न क्लास और उसके एम्बेडेड क्लासों के बीच एक रचनात्मक संबंध स्थापित किया जा सकता है। क्लासों के बीच रचनात्मक संबंध को सामान्य रूप से है-ए संबंध के रूप में भी जाना जाता है।[16] उदाहरण के लिए, एक क्लास कार से बना हो सकता है और इसमें एक क्लास इंजन हो सकता है। इसलिए, एक कार में एक इंजन होता है। रचना का एक रूपरूप रोकथाम है, जो कि उनके पास सम्मिलित उदाहरण द्वारा घटक उदाहरणों का परिक्षेत्र है। यदि एक संलग्न वस्तु में मूल्य के अनुसार घटक उदाहरण होते हैं, तो घटक और उनके संलग्न वस्तु का एक समान वस्तु जीवनकाल होता है। यदि घटक संदर्भ द्वारा समाहित हैं, तो हो सकता है कि उनका जीवनकाल समान न हो।[17] उदाहरण के लिए, ऑब्जेक्टिव-सी 2.0 में:

<वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @इंटरफेस कार: एनएसओब्जेक्ट

@property एनएसएसटींग * नाम; @ संपत्ति इंजन * इंजन @property NSArray *टायर;

@अंत </वाक्यविन्यास हाइलाइट>

यह Car क्लास का एक उदाहरण है NSString (एक स्ट्रिंग (कंप्यूटर विज्ञान) वस्तु), Engine, और NSArray (एक सरणी वस्तु)।

श्रेणीबद्ध

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

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

उदाहरण (आईफोन एसडीके से सरलीकृत उद्देश्य-सी 2.0 कोड): <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @interface UIResponder: NSObject //... @interface UIView: UIResponder //... @interface UIScrollView: UIView //... @interface UITableView: UIScrollView //... </वाक्यविन्यास हाइलाइट> इस उदाहरण में, एक UITableView एक UIScrollView है एक UIView एक UIResponder एक NSObject है।

उपक्लास की परिभाषाएँ

संकल्पनात्मक रूप से, एक सुपरक्लास अपने उपक्लासों का सुपरसेट है। उदाहरण के लिए, एक सामान्य क्लास पदानुक्रम सम्मिलित होगा GraphicObject के सुपरक्लास के रूप में Rectangle और Ellipse, जबकि Square का एक उपक्लास होगा Rectangle. ये सभी समुच्चय सिद्धांत में भी उपसमुच्चय हैं, अर्थात, सभी क्लास आयत हैं लेकिन सभी आयत क्लास नहीं हैं।

एक सामान्य वैचारिक त्रुटि एक उपक्लास के साथ संबंध के एक हिस्से की गलती करना है। उदाहरण के लिए, एक कार और ट्रक दोनों प्रकार के वाहन हैं और उन्हें वाहन क्लास के उपक्लासों के रूप में मॉडल करना उचित होगा। हालांकि, उपक्लास संबंधों के रूप में कार के घटक भागों को मॉडल करना एक त्रुटि होगी। उदाहरण के लिए, एक कार एक इंजन और बॉडी से बनी होती है, लेकिन कार के एक उपक्लास के रूप में इंजन या बॉडी को मॉडल करना उचित नहीं होगा।

वस्तु-उन्मुख मॉडलिंग में इस प्रकार के संबंध सामान्य रूप से ऑब्जेक्ट गुणों के रूप में तैयार किए जाते हैं। इस उदाहरण में, Car क्लास में एक संपत्ति होगी parts. parts वस्तुओं का एक संग्रह रखने के लिए टाइप किया जाएगा, जैसे कि उदाहरण Body, Engine, Tires, वगैरह। ऑब्जेक्ट मॉडलिंग भाषा जैसे कि यूनिफाइड मॉडलिंग भाषा में भाग और अन्य प्रकार के संबंधों के विभिन्न पहलुओं को मॉडल करने की क्षमता सम्मिलित है - डेटा जैसे कि वस्तुओं की प्रमुखता, इनपुट और आउटपुट मूल्यों पर बाधाएं, आदि। इस जानकारी का उपयोग डेवलपर टूल द्वारा किया जा सकता है वस्तुओं के लिए मूल डेटा परिभाषाओं के साथ अतिरिक्त कोड उत्पन्न करें, जैसे कि म्यूटेटर विधि पर त्रुटि जाँच।[20] ऑब्जेक्ट क्लास सिस्टम को मॉडलिंग और कार्यान्वित करते समय एक महत्वपूर्ण सवाल यह है कि क्या एक क्लास में एक या एक से अधिक सुपरक्लास हो सकते हैं। वास्तविक दुनिया में वास्तविक सेट के साथ ऐसा सेट मिलना दुर्लभ होगा जो एक से अधिक अन्य सेट के साथ नहीं मिला हो। हालाँकि, जबकि कुछ प्रणालियाँ जैसे फ्लेवर और सीएलओएस एक से अधिक माता-पिता को रन टाइम पर ऐसा करने की क्षमता प्रदान करते हैं, जटिलता का परिचय देते हैं कि वस्तु-उन्मुख समुदाय में कई लोग पहली बार में ऑब्जेक्ट क्लास का उपयोग करने के लक्ष्यों के लिए विरोधाभासी मानते हैं। एक से अधिक सुपरक्लास के साथ काम करते समय यह समझना जटिल हो सकता है कि संदेश को संभालने के लिए कौन सी कक्षा जिम्मेदार होगी। यदि लापरवाही से उपयोग किया जाता है तो यह सुविधा उसी प्रणाली की कुछ जटिलताओं को पेश कर सकती है और अस्पष्टता क्लासों से बचने के लिए डिज़ाइन की गई थी।[21] अधिकांश आधुनिक वस्तु-उन्मुख भाषाओं जैसे कि स्मॉलटाक और जावा को रन टाइम पर एकल वंशानुक्रम की आवश्यकता होती है। इन भाषाओं के लिए, एकाधिक विरासत मॉडलिंग के लिए उपयोगी हो सकती है लेकिन कार्यान्वयन के लिए नहीं।

हालाँकि, सेमांटिक वेब एप्लिकेशन ऑब्जेक्ट्स में कई सुपरक्लास होते हैं। इंटरनेट की अस्थिरता के लिए इस स्तर के लचीलेपन की आवश्यकता होती है और तकनीकी मानकों जैसे कि वेब ओन्टोलॉजी भाषा | वेब ओन्टोलॉजी भाषा (OWL) को इसका समर्थन करने के लिए डिज़ाइन किया गया है।

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


क्लास अवधारणा और वंशानुक्रम की रूढ़िवादिता

हालाँकि क्लास-आधारित भाषाओं को सामान्य रूप से वंशानुक्रम का समर्थन करने के लिए माना जाता है, वंशानुक्रम क्लासों की अवधारणा का एक आंतरिक रूपरूप नहीं है। कुछ भाषाएँ, जिन्हें प्रायः वस्तु-आधारित भाषाएँ कहा जाता है, क्लासेस का समर्थन करती हैं, फिर भी वंशानुक्रम का समर्थन नहीं करती हैं। वस्तु-आधारित भाषाओं के उदाहरणों में मूल दृश्य के पुराने संस्करण सम्मिलित हैं।


वस्तु-उन्मुख विश्लेषण के भीतर

वस्तु-उन्मुख विश्लेषण और डिजाइन|वस्तु-उन्मुख एनालिसिस और एकीकृत मॉडलिंग भाषा में, दो क्लासों के बीच एक जुड़ाव क्लासेस या उनके संबंधित उदाहरणों के बीच सहयोग का प्रतिनिधित्व करता है। संघों की दिशा है; उदाहरण के लिए, दो क्लासों के बीच एक द्वि-दिशात्मक जुड़ाव इंगित करता है कि दोनों क्लास अपने संबंधों से अवगत हैं।[23] संघों को उनके नाम या उद्देश्य के अनुसार लेबल किया जा सकता है।[24] एक संघ की भूमिका को एक संघ का अंत दिया जाता है और संबंधित क्लास की भूमिका का वर्णन करता है। उदाहरण के लिए, एक सब्सक्राइबर भूमिका उस तरीके का वर्णन करती है जिस तरह से क्लास पर्सन क्लास मैगज़ीन के साथ सब्स्क्राइबर्स-टू एसोसिएशन में भाग लेते हैं। साथ ही, एक पत्रिका की उसी संघ में सदस्यता वाली पत्रिका की भूमिका होती है। एसोसिएशन भूमिका बहुलता बताती है कि एसोसिएशन के अन्य क्लास के प्रत्येक उदाहरण के कितने उदाहरण हैं। सामान्य गुणक 0..1 , 1..1 , 1..* और 0..* हैं, जहां * किसी भी संख्या में उदाहरणों को निर्दिष्ट करता है।[23]


क्लासों का क्लासीकरण

क्लासों की कई श्रेणियां हैं, जिनमें से कुछ ओवरलैप हैं।

<स्पैन क्लास = एंकर आईडी = एब्सट्रैक्ट_एंड_कंक्रीट_क्लासेस > एब्सट्रैक्ट और कंक्रीट

विरासत का समर्थन करने वाली भाषा में, एक सार क्लास, या सार आधार क्लास (एबीसी), एक क्लास है जिसे तत्काल नहीं किया जा सकता है क्योंकि इसे या तो सार के रूप में लेबल किया गया है या यह केवल अमूर्त विधियों (या 'वर्चुअल विधियों) को निर्दिष्ट करता है। एक सार क्लास कुछ विधियों का कार्यान्वयन प्रदान कर सकता है, और प्रकार के हस्ताक्षर के माध्यम से आभासी विधियों को भी निर्दिष्ट कर सकता है जो कि अमूर्त क्लास के प्रत्यक्ष या अप्रत्यक्ष वंशजों द्वारा कार्यान्वित किया जाना है। इससे पहले कि एक अमूर्त क्लास से प्राप्त एक क्लास को तत्काल किया जा सके, उसके मूल क्लास के सभी अमूर्त तरीकों को व्युत्पत्ति श्रृंखला में कुछ क्लास द्वारा प्रयुक्त किया जाना चाहिए।[25] अधिकांश वस्तु-उन्मुख प्रोग्रामिंग भाषा प्रोग्रामर को यह निर्दिष्ट करने की अनुमति देती हैं कि किन क्लासों को अमूर्त माना जाता है और इन्हें तत्काल करने की अनुमति नहीं दी जाएगी। उदाहरण के लिए, Java (प्रोग्रामिंग भाषा), C Sharp (प्रोग्रामिंग भाषा)|C# और PHP में, कीवर्ड एब्स्ट्रैक्ट का उपयोग किया जाता है।[26][27] सी ++ में, एक सार क्लास एक क्लास है जिसमें कम से कम एक अमूर्त विधि है जो उस भाषा में उचित सिंटैक्स द्वारा दी गई है (सी ++ पार्लेंस में एक शुद्ध वर्चुअल फ़ंक्शन)।[25]

एक क्लास जिसमें केवल आभासी विधियाँ होती हैं, उसे C++ में शुद्ध सार आधार क्लास (या शुद्ध ABC) कहा जाता है और इसे भाषा के उपयोगकर्ताओं द्वारा इंटरफ़ेस के रूप में भी जाना जाता है।[13]अन्य भाषाएँ, विशेष रूप से जावा और सी #, भाषा में एक कीवर्ड के माध्यम से इंटरफ़ेस (जावा) नामक सार क्लासों के एक संस्करण का समर्थन करती हैं। इन भाषाओं में, एकाधिक वंशानुक्रम की अनुमति नहीं है, लेकिन एक क्लास कई इंटरफेस प्रयुक्त कर सकता है। ऐसी कक्षा में केवल सार सार्वजनिक रूप से सुलभ विधियां हो सकती हैं।[19][28][29] एक ठोस क्लास एक ऐसा क्लास है जो अमूर्त क्लासों के विपरीत तात्कालिकता (कंप्यूटर विज्ञान) हो सकता है, जो नहीं कर सकता।


स्थानीय और आंतरिक

कुछ भाषाओं में, क्लासेस को वैश्विक दायरे के अलावा कार्यक्षेत्र (प्रोग्रामिंग) में घोषित किया जा सकता है। इस तरह के कई प्रकार के क्लास हैं।

एक आंतरिक क्लास एक अन्य क्लास के अंदरपरिभाषित क्लास है। एक आंतरिक क्लास और उसके युक्त क्लास के बीच संबंध को दूसरे प्रकार के क्लास संघ के रूप में भी माना जा सकता है। एक आंतरिक क्लास सामान्य रूप से न तो संलग्न क्लास के उदाहरणों से जुड़ा होता है और न ही इसके संलग्न क्लास के साथ तत्काल होता है। भाषा के आधार पर, संलग्न कक्षा के बाहर से कक्षा को संदर्भित करना संभव हो सकता है या नहीं भी हो सकता है। एक संबंधित अवधारणा आंतरिक प्रकार है, जिसे आंतरिक डेटा प्रकार या नेस्टेड प्रकार के रूप में भी जाना जाता है, जो आंतरिक क्लासों की अवधारणा का एक सामान्यीकरण है। C++ एक ऐसी भाषा का उदाहरण है जो आंतरिक क्लासेस और आंतरिक प्रकारों दोनों का समर्थन करती है ("टाइपपीफ" घोषणाओं के माध्यम से)।[30][31] एक अन्य प्रकार एक स्थानीय क्लास है, जो एक प्रक्रिया या कार्य के अंदरपरिभाषित क्लास है। यह क्लास के नाम के संदर्भ को उस दायरे के अंदरसीमित करता है जहां कक्षा घोषित की जाती है। भाषा के सिमेंटिक नियमों के आधार पर, स्थानीय क्लासों पर गैर-स्थानीय लोगों की तुलना में अतिरिक्त प्रतिबंध हो सकते हैं। एक सामान्य प्रतिबंध स्थानीय क्लास विधियों को संलग्न कार्य के स्थानीय वेरीएबल तक पहुँचने के लिए अस्वीकार करना है। उदाहरण के लिए, C ++ में, एक स्थानीय क्लास अपने संलग्न कार्य के अंदरघोषित स्थिर वेरीएबल को संदर्भित कर सकता है, लेकिन फ़ंक्शन के स्वचालित वेरीएबल तक नहीं पहुंच सकता है।[32]


मेटाक्लास

मेटाक्लास वे क्लास हैं जिनके उदाहरण क्लास हैं।[33] एक मेटाक्लास क्लासेस के संग्रह की एक सामान्य संरचना का वर्णन करता है और एक डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) को प्रयुक्त कर सकता है या विशेष प्रकार की क्लासेस का वर्णन कर सकता है। सॉफ्टवेयर ढांचे का वर्णन करने के लिए प्रायः मेटाक्लास का उपयोग किया जाता है।[34] कुछ भाषाओं में, जैसे कि पायथन (प्रोग्रामिंग भाषा), रूबी (प्रोग्रामिंग भाषा) या स्मॉलटाक, एक क्लास भी एक वस्तु है; इस प्रकार प्रत्येक क्लास एक अद्वितीय मेटाक्लास का एक उदाहरण है जिसे भाषा में बनाया गया है। [4] [35] [36] कॉमन लिस्प ऑब्जेक्ट सिस्टम (सीएलओएस) उन क्लासों और मेटाक्लासेस को प्रयुक्त करने के लिए मेटाऑब्जेक्ट (एमओपी) प्रदान करता है। [37]


गैर-उपक्लासीय

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

क्लास को घोषित करके एक गैर-उपक्लासीय क्लास बनाया जाता है sealed सी # या के रूप में final जावा या PHP में।[38][39][40] उदाहरण के लिए, जावा String क्लास को अंतिम के रूप में नामित किया गया है।[41] गैर-उपक्लासीय क्लास एक संकलक (संकलित भाषाओं में) को अनुकूलन करने की अनुमति दे सकते हैं जो उपक्लासीय क्लासों के लिए उपलब्ध नहीं हैं। [42]


खुली कक्षा

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

मिश्रण

कुछ भाषाओं में मिश्रणों के लिए विशेष समर्थन होता है, हालांकि किसी भी भाषा में एकाधिक वंशानुक्रम के साथ एक मिश्रण केवल एक क्लास है जो एक प्रकार के संबंध का प्रतिनिधित्व नहीं करता है। mixin्स का उपयोग सामान्य रूप से एक ही तरीके को कई क्लासों में जोड़ने के लिए किया जाता है; उदाहरण के लिए, एक क्लास UnicodeConversionMixin नामक विधि प्रदान कर सकता है unicode_to_ascii जब क्लासेस में सम्मिलित किया गया FileReader और WebPageScraper जो एक सामान्य माता-पिता को साझा नहीं करते हैं।

आंशिक

सुविधा का समर्थन करने वाली भाषाओं में, एक आंशिक क्लास एक ऐसा क्लास है जिसकी परिभाषा को एक ही स्रोत कोड|स्रोत-कोड फ़ाइल या एकाधिक फ़ाइलों में कई टुकड़ों में विभाजित किया जा सकता है।[44] टुकड़ों को संकलन-समय पर विलय कर दिया जाता है, जिससे कंपाइलर आउटपुट एक गैर-आंशिक क्लास के समान हो जाता है।

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

आंशिक क्लास सुविधा के अन्य लाभों और प्रभावों में सम्मिलित हैं:

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

स्मॉलटाक में क्लास एक्सटेंशन के नाम से आंशिक क्लासेस काफी समय से सम्मिलित हैं। .NET Framework|.NET Framework 2 के आगमन के साथ, Microsoft ने C Sharp (प्रोग्रामिंग भाषा)|C# 2.0 और Visual Basic .NET दोनों में समर्थित आंशिक क्लासेस की शुरुआत की। WinRT भी आंशिक क्लासेस का समर्थन करता है।

VB.NET में उदाहरण

विजुअल बेसिक .NET में लिखा गया यह सरल उदाहरण दिखाता है कि एक ही क्लास के भागों को दो अलग-अलग फाइलों में कैसे परिभाषित किया जाता है। फ़ाइल1.वीबी: <वाक्यविन्यास लैंग = vbnet> आंशिक क्लास MyClass

   निजी _नाम स्ट्रिंग के रूप में

अंत क्लास </वाक्यविन्यास हाइलाइट> फ़ाइल 2.वीबी: <वाक्यविन्यास लैंग = vbnet> आंशिक क्लास MyClass

   सार्वजनिक रीडोनली संपत्ति का नाम () स्ट्रिंग के रूप में
        पाना
            रिटर्न _नाम
        अंत प्राप्त करें
   संपत्ति समाप्त करें

अंत क्लास </वाक्यविन्यास हाइलाइट> संकलित होने पर, परिणाम वही होता है जैसे दो फाइलें एक के रूप में लिखी जाती हैं, जैसे: <वाक्यविन्यास लैंग = vbnet> क्लास माय क्लास

   निजी _नाम स्ट्रिंग के रूप में
   सार्वजनिक रीडोनली संपत्ति का नाम () स्ट्रिंग के रूप में
        पाना
            रिटर्न _नाम
        अंत प्राप्त करें
   संपत्ति समाप्त करें

अंत क्लास </वाक्यविन्यास हाइलाइट>

उद्देश्य सी में उदाहरण

उद्देश्य-सी में, आंशिक क्लासेस, जिन्हें श्रेणियों के रूप में भी जाना जाता है, निम्न उदाहरणों की तरह कई पुस्तकालयों और निष्पादनयोग्य में भी फैल सकती हैं। लेकिन एक महत्वपूर्ण अंतर यह है कि ऑब्जेक्टिव-सी की श्रेणियां अन्य इंटरफ़ेस घोषणा में परिभाषाओं को अधिलेखित कर सकती हैं, और ये श्रेणियां मूल क्लास परिभाषा के बराबर नहीं हैं (पहले को अंतिम की आवश्यकता होती है)।[45] इसके अतिरिक्त, .NET आंशिक क्लास में परस्पर विरोधी परिभाषाएँ नहीं हो सकती हैं, और सभी आंशिक परिभाषाएँ अन्य के बराबर हैं।[44]

फाउंडेशन में, हेडर फ़ाइल NSData.h: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी> @ इंटरफेस एनएसडीटा: एनएसओब्जेक्ट

- (आईडी) initWithContentsOfURL:(NSURL *)URL; //...

@अंत </वाक्यविन्यास हाइलाइट> उपयोगकर्ता द्वारा आपूर्ति की गई लाइब्रेरी में, फाउंडेशन रूपरेखा से एक अलग बाइनरी, हेडर फाइल NSData+base64.h: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>

  1. आयात <फाउंडेशन/फाउंडेशन.एच>

@ इंटरफेस एनएसडीटा (बेस 64)

- (एनएसएसटींग *) बेस 64 स्ट्रिंग; - (आईडी) initWithBase64String:(NSString *)base64String;

@अंत </वाक्यविन्यास हाइलाइट> और एक ऐप में, एक और अलग बाइनरी फ़ाइल, स्रोत कोड फ़ाइल main.m: <वाक्यविन्यास हाइलाइट लैंग = ओबीजेसी>

  1. आयात <फाउंडेशन/फाउंडेशन.एच>
  2. import NSData+base64.h

इंट मेन (इंट एआरजीसी, चार * एआरजीवी []) {

   अगर (एआरजीसी <2)
       वापसी EXIT_FAILURE;
   NSString *sourceURLString = [NSString stringWithCString:argv[1;
   एनएसडीटा * डेटा = एनएसडीटा आवंटन] initWithContentsOfURL: [NSURL URLWithString:sourceURLString;
   एनएसएलओजी (@% @, [डेटा बेस 64 स्ट्रिंग]);
   वापसी EXIT_SUCCESS;

} </वाक्यविन्यास हाइलाइट> डिस्पैवेरीएबल NSData इंस्टेंस पर बुलाए गए दोनों तरीकों को ढूंढेगा और दोनों को सही तरीके से इनवॉइस करेगा।

अनइंस्टेंटेबल

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

उदाहरण के लिए, सी # में, स्थिर चिह्नित क्लास को तत्काल नहीं किया जा सकता है, केवल स्थिर सदस्य (क्षेत्र, विधियों, अन्य) हो सकते हैं, हो सकता है कि 'इंस्टेंस कन्स्ट्रक्टर' न हो, और मुहरबंद हो। [46]


अनाम

एक अनाम क्लास या अनाम क्लास एक ऐसा क्लास है जो परिभाषा पर किसी नाम या पहचानकर्ता के लिए बाध्य नहीं है।[47][48] यह नामांकित बनाम अज्ञात फ़ंक्शन के अनुरूप है।

लाभ

सॉफ़्टवेयर को वस्तु क्लासों में व्यवस्थित करने के लाभ तीन श्रेणियों में आते हैं:[49]

  • त्वरित विकास
  • रखरखाव में आसानी
  • कोड और डिजाइन का पुन: उपयोग

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

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


रन-टाइम प्रतिनिधित्व

डेटा प्रकार के रूप में, एक क्लास को सामान्य रूप से संकलन-समय के निर्माण के रूप में माना जाता है।[52] एक भाषा या पुस्तकालय प्रोटोटाइप-आधारित प्रोग्रामिंग या फैक्टरी विधि पैटर्न मेटाऑब्जेक्ट्स का भी समर्थन कर सकता है जो क्लासेस के बारे में रन-टाइम जानकारी का प्रतिनिधित्व करता है, या यहां तक ​​कि मेटाडेटा का प्रतिनिधित्व करता है जो प्रतिबिंब (कंप्यूटर विज्ञान) सुविधाओं तक पहुंच प्रदान करता है और रन-टाइम पर डेटा संरचना स्वरूपों में हेरफेर करने की क्षमता प्रदान करता है। . कई भाषाएँ क्लासेस के बारे में इस तरह की रन-टाइम प्रकार की जानकारी को एक क्लास से इस आधार पर अलग करती हैं कि रन-टाइम पर जानकारी की आवश्यकता नहीं होती है। कुछ गतिशील भाषाएँ रन-टाइम और कंपाइल-टाइम निर्माणों के बीच सख्त अंतर नहीं करती हैं, और इसलिए मेटाऑब्जेक्ट्स और क्लासेस के बीच अंतर नहीं कर सकती हैं।

उदाहरण के लिए, यदि मानव क्लास व्यक्ति का प्रतिनिधित्व करने वाला एक मेटाऑब्जेक्ट है, तो मानव मेटाऑब्जेक्ट की सुविधाओं का उपयोग करके क्लास व्यक्ति के उदाहरण बनाए जा सकते हैं।

यह भी देखें

टिप्पणियाँ

  1. 1.0 1.1 Gamma et al. 1995, p. 14.
  2. 2.0 2.1 Bruce 2002, 2.1 Objects, classes, and object types, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18.
  3. Gamma et al. 1995, p. 17.
  4. 4.0 4.1 "3. Data model". The Python Language Reference. Python Software Foundation. Retrieved 2012-04-26.
  5. Booch 1994, p. 86-88.
  6. "Classes (I)". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-29.
  7. "Classes (II)". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-29.
  8. Booch 1994, p. 105.
  9. Jamrich, Parsons, June (2015-06-22). New perspectives computer concepts, 2016. Comprehensive. Boston, MA. ISBN 9781305271616. OCLC 917155105.{{cite book}}: CS1 maint: location missing publisher (link) CS1 maint: multiple names: authors list (link)
  10. 10.0 10.1 "Controlling Access to Members of a Class". The Java Tutorials. Oracle. Retrieved 2012-04-19.
  11. "OOP08-CPP. Do not return references to private data". CERT C++ Secure Coding Standard. Carnegie Mellon University. 2010-05-10. Archived from the original on 2015-10-03. Retrieved 2012-05-07.
  12. Ben-Ari, Mordechai (2007-01-24). "2.2 Identifiers" (PDF). Compile and Runtime Errors in Java. Archived (PDF) from the original on 2011-10-18. Retrieved 2012-05-07.
  13. 13.0 13.1 Wild, Fred. "C++ Interfaces". Dr. Dobb's. UBM Techweb. Retrieved 2012-05-02.
  14. Thomas; Hunt. "Classes, Objects, and Variables". Programming Ruby: The Pragmatic Programmer's Guide. Ruby-Doc.org. Retrieved 2012-04-26.
  15. "Friendship and inheritance". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-26.
  16. Booch 1994, p. 180.
  17. Booch 1994, p. 128-129.
  18. Booch 1994, p. 112.
  19. 19.0 19.1 "इंटरफेस". The Java Tutorials. Oracle. Retrieved 2012-05-01.
  20. Berfeld, Marya (2 December 2008). "UML-to-Java transformation in IBM Rational Software Architect editions and related software". IBM. Retrieved 20 December 2013.
  21. Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Object Oriented Software Engineering. Addison-Wesley ACM Press. pp. 43–69. ISBN 0-201-54435-0.
  22. Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (2006-03-09). "A Semantic Web Primer for Object-Oriented Software Developers". W3C. Retrieved 2008-07-30.
  23. 23.0 23.1 Bell, Donald. "UML Basics: The class diagram". developer Works. IBM. Retrieved 2012-05-02.
  24. Booch 1994, p. 179.
  25. 25.0 25.1 "बहुरूपता". C++ Language Tutorial. cplusplus.com. Retrieved 2012-05-02.
  26. "Abstract Methods and Classes". The Java Tutorials. Oracle. Retrieved 2012-05-02.
  27. "Class Abstraction". PHP Manual. The PHP Group. Retrieved 2012-05-02.
  28. "Interfaces (C# Programming Guide)". C# Programming Guide. Microsoft. Retrieved 2013-08-15.
  29. "Inheritance (C# Programming Guide)". C# Programming Guide. Microsoft. Retrieved 2012-05-02.
  30. "Nested classes (C++ only)". XL C/C++ V8.0 for AIX. IBM. Retrieved 2012-05-07.
  31. "Local type names (C++ only)". XL C/C++ V8.0 for AIX. IBM. Retrieved 2012-05-07.
  32. "Local classes (C++ only)". XL C/C++ V8.0 for AIX. IBM. Retrieved 2012-05-07.
  33. Booch 1994, p. 133-134.
  34. "13 Classes and metaclasses". pharo.gforge.inria.fr. Retrieved 2016-10-31.
  35. Thomas; Hunt. "Classes and Objects". Programming Ruby: The Pragmatic Programmer's Guide. Ruby-Doc.org. Retrieved 2012-05-08.
  36. Booch 1994, p. 134.
  37. "MOP: Concepts". The Common Lisp Object System MetaObject Protocol. Association of Lisp Users. Archived from the original on 2010-11-15. Retrieved 2012-05-08.
  38. "sealed (C# Reference)". C# Reference. Microsoft. Retrieved 2012-05-08.
  39. "Writing Final Classes and Methods". The Java Tutorials. Oracle. Retrieved 2012-05-08.
  40. "PHP: Final Keyword". PHP Manual. The PHP Group. Retrieved 2014-08-21.
  41. "String (Java Platform SE 7)". Java Platform, Standard Edition 7: API Specification. Oracle. Retrieved 2012-05-08.
  42. Brand, Sy (2 March 2020). "The Performance Benefits of Final Classes". Microsoft C++ team blog. Microsoft. Retrieved 4 April 2020.
  43. "9. Classes". The Python Tutorial. Python.org. Retrieved 3 March 2018. As is true for modules, classes partake of the dynamic nature of Python: they are created at runtime, and can be modified further after creation.
  44. 44.0 44.1 44.2 mairaw; BillWagner; tompratt-AQ (2015-09-19), "Partial Classes and Methods", C# Programming Guide, Microsoft, retrieved 2018-08-08
  45. Apple (2014-09-17), "Customizing Existing Classes", Programming with Objective-C, Apple, retrieved 2018-08-08
  46. "Static Classes and Static Class Members (C# Programming Guide)". C# Programming Guide. Microsoft. Retrieved 2012-05-08.
  47. "Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)". docs.oracle.com. Retrieved 2021-05-13.
  48. "PHP: Anonymous classes - Manual". www.php.net. Retrieved 2021-08-11.
  49. "What is an Object?". oracle.com. Oracle Corporation. Retrieved 13 December 2013.
  50. Booch, Grady; Robert A. Maksimchuk; Michael W. Engle; Bobbi J. Young Ph.D.; Jim Conallen; Kelli A. Houston (April 30, 2007). Object-Oriented Analysis and Design with Applications. Addison-Wesley Professional. pp. 1–28. ISBN 978-0-201-89551-3. Retrieved 20 December 2013. There are fundamental limiting factors of human cognition; we can address these constraints through the use of decomposition, abstraction, and hierarchy.
  51. Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Object Oriented Software Engineering. Addison-Wesley ACM Press. ISBN 0-201-54435-0.
  52. "C++ International standard" (PDF). Working Draft, Standard for Programming Language C++. ISO/IEC JTC1/SC22 WG21. Archived (PDF) from the original on 2017-12-09. Retrieved 5 January 2020.


संदर्भ


अग्रिम पठन