मेटाक्लास: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(4 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|A metaclass describes commen behaviour for classes, like a class does for objects}}[[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग | ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, एक मेटाक्लास एक [[ कक्षा (कंप्यूटर विज्ञान) |कक्षा (कंप्यूटर विज्ञान)]] है, जिसके उदाहरण क्लास हैं। जिस तरह एक साधारण वर्ग कुछ वस्तुओं के व्यवहार को परिभाषित करता है, उसी तरह एक मेटाक्लास कुछ वर्गों और उनके उदाहरणों के व्यवहार को परिभाषित करता है। सभी वस्तु-उन्मुख [[प्रोग्रामिंग भाषा]]एँ मेटाक्लास का समर्थन नहीं करती हैं। ऐसा करने वालों में, वर्ग व्यवहार के किसी दिए गए पहलू को मेटाक्लास किस सीमा तक ओवरराइड कर सकता है। प्रथम श्रेणी के नागरिक या प्रथम श्रेणी के नागरिक होने से मेटाक्लास को प्रयुक्त किया जा सकता है, इस स्थिति में एक मेटाक्लास केवल एक वस्तु है जो कक्षाओं का निर्माण करती है। प्रत्येक भाषा का अपना [[मेटाऑब्जेक्ट प्रोटोकॉल]] होता है, नियमों का एक सेट जो यह नियंत्रित करता है कि ऑब्जेक्ट, क्लासेस और मेटाक्लास कैसे इंटरैक्ट करते हैं।<ref>{{cite book|author=Ira R. Forman and Scott Danforth|title=मेटाक्लासेस को काम में लाना|year=1999|isbn=0-201-43305-2}}</ref>
{{Short description|A metaclass describes commen behaviour for classes, like a class does for objects}}[[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग | ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, एक मेटाक्लास एक [[ कक्षा (कंप्यूटर विज्ञान) |क्लास (कंप्यूटर विज्ञान)]] है, जिसके उदाहरण क्लास हैं। जिस तरह एक साधारण वर्ग कुछ वस्तुओं के व्यवहार को परिभाषित करता है, उसी तरह एक मेटाक्लास कुछ वर्गों और उनके उदाहरणों के व्यवहार को परिभाषित करता है। सभी वस्तु-उन्मुख [[प्रोग्रामिंग भाषा]]एँ मेटाक्लास का समर्थन नहीं करती हैं। ऐसा करने वालों में, वर्ग व्यवहार के किसी दिए गए पहलू को मेटाक्लास किस सीमा तक ओवरराइड कर सकता है। प्रथम श्रेणी के नागरिक या प्रथम श्रेणी के नागरिक होने से मेटाक्लास को प्रयुक्त किया जा सकता है, इस स्थिति में एक मेटाक्लास केवल एक वस्तु है जो कक्षाओं का निर्माण करती है। प्रत्येक भाषा का अपना [[मेटाऑब्जेक्ट प्रोटोकॉल]] होता है, नियमों का एक सेट जो यह नियंत्रित करता है कि ऑब्जेक्ट, क्लासेस और मेटाक्लास कैसे इंटरैक्ट करते हैं।<ref>{{cite book|author=Ira R. Forman and Scott Danforth|title=मेटाक्लासेस को काम में लाना|year=1999|isbn=0-201-43305-2}}</ref>




Line 56: Line 56:
== स्मॉलटाक -80 में ==
== स्मॉलटाक -80 में ==
[[File:Smalltalk 80 metaclasses.svg|thumb|यूएमएल आरेख के रूप में स्मॉलटॉक-80 मेटाक्लास पदानुक्रम]]
[[File:Smalltalk 80 metaclasses.svg|thumb|यूएमएल आरेख के रूप में स्मॉलटॉक-80 मेटाक्लास पदानुक्रम]]
[[File:Smalltalk metaclass.png|thumb|स्मालटाक में वर्गों और मेटाक्लासेस के बीच वंशानुक्रम और उदाहरण संबंधों का आरेख]]स्मॉलटाक में, सब कुछ एक [[वस्तु (कंप्यूटर विज्ञान)]] है। इसके अतिरिक्त, स्मॉलटाक एक [[कक्षा आधारित प्रोग्रामिंग]] सिस्टम है, जिसका अर्थ है कि प्रत्येक वस्तु में एक वर्ग होता है जो उस वस्तु की संरचना को परिभाषित करता है (अर्थात वस्तु के उदाहरण चर) और संदेश एक वस्तु को समझता है। साथ में इसका तात्पर्य है कि स्मॉलटाक में एक वर्ग एक वस्तु है और इसलिए एक वर्ग को एक वर्ग (मेटाक्लास कहा जाता है) का एक उदाहरण होना चाहिए।
[[File:Smalltalk metaclass.png|thumb|स्मालटाक में वर्गों और मेटाक्लासेस के बीच इनहेरिटेंस और उदाहरण संबंधों का आरेख]]स्मॉलटाक में, सब कुछ एक [[वस्तु (कंप्यूटर विज्ञान)]] है। इसके अतिरिक्त स्मॉलटाक एक [[कक्षा आधारित प्रोग्रामिंग|क्लास आधारित प्रोग्रामिंग]] सिस्टम है, जिसका अर्थ है कि प्रत्येक वस्तु में एक वर्ग होता है जो उस वस्तु की संरचना को परिभाषित करता है (अर्थात वस्तु के उदाहरण चर) और संदेश एक वस्तु को समझता है। साथ में इसका तात्पर्य है कि स्मॉलटाक में एक वर्ग एक वस्तु है और इसलिए एक वर्ग को एक वर्ग (मेटाक्लास कहा जाता है) का एक उदाहरण होना चाहिए।


उदाहरण के तौर पर, एक कार वस्तु <code>c</code> वर्ग का उदाहरण है <code>Car</code>. बदले में, वर्ग <code>Car</code> फिर से एक वस्तु है और इस तरह के मेटाक्लास का एक उदाहरण है <code>Car</code> बुलाया <code>Car class</code>. मेटाक्लास के नाम पर रिक्त स्थान पर ध्यान दें। मेटाक्लास का नाम स्मॉलटाक एक्सप्रेशन है, जिसका मूल्यांकन करने पर, मेटाक्लास ऑब्जेक्ट में परिणाम होता है। इस प्रकार मूल्यांकन <code>Car class</code> के लिए मेटाक्लास ऑब्जेक्ट में परिणाम <code>Car</code> जिसका नाम है <code>Car class</code> (कोई मूल्यांकन करके इसकी पुष्टि कर सकता है <code>Car class name</code> जो के मेटाक्लास का नाम लौटाता है <code>Car</code>.)
उदाहरण के रूप से, एक <code>Car</code> ऑब्जेक्ट <code>c</code> क्लास <code>Car</code>का एक उदाहरण है। बदले में, क्लास <code>Car</code>फिर से एक ऑब्जेक्ट है और <code>Car</code>के मेटाक्लास का एक उदाहरण है जिसे <code>Car</code><code>class</code> कहा जाता है। मेटाक्लास के नाम में रिक्त स्थान पर ध्यान दें। मेटाक्लास का नाम स्मॉलटॉक एक्सप्रेशन है, जिसका मूल्यांकन करने पर मेटाक्लास ऑब्जेक्ट प्राप्त होता है। इस <code>Car class</code> वर्ग के मूल्यांकन से <code>Car</code> के लिए मेटाक्लास ऑब्जेक्ट प्राप्त होता है जिसका नाम <code>Car</code><code>class</code> है (कोई <code>Car class name</code>का मूल्यांकन करके इसकी पुष्टि कर सकता है जो <code>Car</code>के मेटाक्लास का नाम लौटाता है।)


[[वर्ग विधि]] तरीके वास्तव में मेटाक्लास से संबंधित होते हैं, जैसे उदाहरण के तरीके वास्तव में क्लास के होते हैं। जब वस्तु को संदेश भेजा जाता है <code>2</code>, में विधि की खोज शुरू होती है <code>Integer</code>. यदि यह नहीं मिलता है तो यह सुपरक्लास श्रृंखला को आगे बढ़ाता है, वस्तु पर रुकता है चाहे वह पाया जाता है या नहीं।
क्लास विधियाँ वास्तव में मेटाक्लास से संबंधित होती हैं, जैसे इंस्टेंस विधियाँ वास्तव में क्लास से संबंधित होती हैं। जब ऑब्जेक्ट पर एक संदेश भेजा जाता है, तो विधि की खोज <code>Integer</code>में प्रारंभ होती है। यदि यह नहीं मिलता है तो यह सुपरक्लास श्रृंखला में आगे बढ़ता है, ऑब्जेक्ट पर रुकता है, चाहे वह पाया जाए या नहीं पाया जाता है।


जब कोई संदेश भेजा जाता है <code>Integer</code> में विधि की खोज शुरू होती है <code>Integer class</code> और सुपर क्लास चेन को आगे बढ़ाता है <code>Object class</code>. ध्यान दें कि, अब तक, मेटाक्लास वंशानुक्रम श्रृंखला वास्तव में वर्ग वंशानुक्रम श्रृंखला का अनुसरण करती है। किंतु मेटाक्लास श्रृंखला आगे बढ़ती है क्योंकि <code>Object class</code> का उपवर्ग है <code>Class</code>. सभी मेटाक्लास क्लास के उपवर्ग हैं।
जब कोई संदेश <code>Integer</code>को भेजा जाता है तो विधि की खोज <code>Integer class</code> में शुरू होती है और सुपरक्लास श्रृंखला से <code>Object class</code>. तक आगे बढ़ती है। ध्यान दें कि, अब तक, मेटाक्लास इनहेरिटेंस श्रृंखला बिल्कुल क्लास इनहेरिटेंस श्रृंखला का अनुसरण करती है। लेकिन मेटाक्लास श्रृंखला आगे बढ़ती है क्योंकि <code>Object class</code>. <code>Class</code> का उपवर्ग है। सभी मेटाक्लास क्लास के उपवर्ग हैं।


शुरुआती स्मॉलटाक में, केवल एक मेटाक्लास कहा जाता था <code>Class</code>. इसका तात्पर्य यह है कि [[विधि (कंप्यूटर विज्ञान)]] सभी वर्ग समान थे, विशेष रूप से नई वस्तुओं को बनाने की विधि, अर्थात। <code>new</code>. कक्षाओं को अपने स्वयं के तरीके और अपने स्वयं के आवृत्ति चर (कक्षा उदाहरण चर कहा जाता है और [[वर्ग चर]] के साथ भ्रमित नहीं होना चाहिए) की अनुमति देने के लिए, प्रत्येक वर्ग के लिए स्मॉलटॉक -80 की शुरुआत की गई <code>C</code> उनका अपना मेटाक्लास <code>C class</code>. इसका अर्थ है कि प्रत्येक मेटाक्लास प्रभावी रूप से एक [[सिंगलटन पैटर्न]] वर्ग है।
आरंभिक स्मॉलटाक में, केवल एक मेटाक्लास था जिसे <code>Class</code>कहा जाता था। इसका तात्पर्य यह था कि सभी वर्गों की विधियाँ समान थीं, विशेष रूप से नई वस्तुएँ बनाने की विधि, अर्थात<code>new</code>कक्षाओं को अपने स्वयं के विधि और अपने स्वयं के इंस्टेंस वेरिएबल्स (जिसे क्लास इंस्टेंस वेरिएबल्स कहा जाता है और इसे क्लास वेरिएबल्स के साथ भ्रमित नहीं किया जाना चाहिए) की अनुमति देने के लिए, स्मॉलटॉक -80 ने प्रत्येक क्लास <code>C</code> के लिए अपने स्वयं के मेटाक्लास <code>C class</code> की प्रारंभ की। इसका मतलब यह है कि प्रत्येक मेटाक्लास प्रभावी रूप से एक सिंगलटन क्लास है।


चूँकि कोई आवश्यकता नहीं है कि मेटाक्लास एक दूसरे से अलग व्यवहार करते हैं, सभी मेटाक्लास केवल एक वर्ग के उदाहरण हैं जिन्हें कहा जाता है <code>Metaclass</code>. का मेटाक्लास <code>Metaclass</code> कहा जाता है <code>Metaclass class</code> जो फिर से वर्ग का एक उदाहरण है <code>Metaclass</code>.
चूँकि ऐसी कोई आवश्यकता नहीं है कि मेटाक्लास एक-दूसरे से भिन्न व्यवहार करें, सभी मेटाक्लास केवल एक ही वर्ग के उदाहरण हैं जिन्हें मेटाक्लास कहा जाता है। <code>Metaclass</code> के <code>Metaclass</code>को <code>Metaclass class</code> कहा जाता है जो फिर से <code>Metaclass</code>क्लास का एक उदाहरण है।


स्मॉलटाक -80 में, हर वर्ग (छोड़कर <code>Object</code>) में एक [[सुपरक्लास (कंप्यूटर विज्ञान)]] है। सभी मेटाक्लासेस का [[सार सुपरक्लास]] है <code>Class</code>, जो वर्गों की सामान्य प्रकृति का वर्णन करता है।
स्मॉलटॉक-80 में, प्रत्येक वर्ग (<code>Object</code>को छोड़कर) में एक सुपरक्लास होता है। सभी मेटाक्लास का अमूर्त सुपरक्लास <code>Class</code>है, जो कक्षाओं की सामान्य प्रकृति का वर्णन करता है।


मेटाक्लास के लिए सुपरक्लास पदानुक्रम समानांतर है कि कक्षाओं के लिए, कक्षा को छोड़कर <code>Object</code>. सभी मेटाक्लास इसके उपवर्ग हैं <code>Class</code>, इसलिए:
मेटाक्लास के लिए सुपरक्लास पदानुक्रम, क्लास <code>Object</code>को छोड़कर, कक्षाओं के समान है। सभी मेटाक्लास <code>Class</code>के उपवर्ग हैं, इसलिए:
* <code>Object class superclass == Class.</code>
* <code>Object class superclass == Class.</code>
जुड़वाँ बच्चों की तरह, कक्षाएं और मेटाक्लास एक साथ पैदा होते हैं। <code>Metaclass</code> एक उदाहरण चर है <code>thisClass</code>, जो इसके संयुक्त वर्ग की ओर इशारा करता है।
जुड़े हुए जुड़वाँ बच्चों की तरह, वर्ग और मेटाक्लास एक साथ उत्पन्न होते हैं। <code>Metaclass</code> में एक इंस्टेंस वैरिएबल <code>thisClass</code>है, जो इसके संयुक्त वर्ग को इंगित करता है। ध्यान दें कि सामान्य स्मॉलटॉक क्लास ब्राउज़र मेटाक्लास को अलग-अलग कक्षाओं के रूप में नहीं दिखाता है। इसके अतिरिक्त क्लास ब्राउज़र एक ही समय में क्लास को उसके मेटाक्लास के साथ संपादित करने की अनुमति देता है।
ध्यान दें कि सामान्य स्मॉलटॉक [[वर्ग ब्राउज़र]] मेटाक्लास को अलग-अलग क्लास के रूप में नहीं दिखाता है। इसके अतिरिक्त क्लास ब्राउज़र एक ही समय में अपने मेटाक्लास के साथ क्लास को संपादित करने की अनुमति देता है।


मेटाक्लास पदानुक्रम में कक्षाओं के नाम समान नाम की अवधारणाओं से आसानी से भ्रमित हो जाते हैं। उदाहरण के लिए:
मेटाक्लास पदानुक्रम में कक्षाओं के नाम समान नाम की अवधारणाओं से आसानी से भ्रमित हो जाते हैं। उदाहरण के लिए:
* <code>Object</code> आधार वर्ग है जो सभी वस्तुओं के लिए सामान्य तरीके प्रदान करता है; एक वस्तु एक पूर्णांक, या एक विजेट, या एक है <code>Car</code>, वगैरह।
*<code>Object</code> आधार वर्ग है जो सभी ऑब्जेक्ट के लिए सामान्य विधि प्रदान करता है; "एक वस्तु" एक पूर्णांक, या एक विजेट, या एक <code>Car</code>, आदि है।
* <code>Class</code> मेटाक्लास का आधार है जो सभी वर्गों के लिए सामान्य तरीके प्रदान करता है (हालांकि यह स्वयं मेटाक्लास नहीं है); एक वर्ग कुछ ऐसा है <code>Integer</code>, या <code>Widget</code>, या <code>Car</code>, वगैरह।
*<code>Class</code> मेटाक्लास का आधार है जो सभी वर्गों के लिए सामान्य तरीके प्रदान करता है (चूँकि यह स्वयं मेटाक्लास नहीं है); "एक वर्ग" <code>Integer</code>, या <code>Widget</code>, या <code>Car</code> इत्यादि जैसा कुछ है।
* <code>Metaclass</code> सभी मेटाक्लास के लिए सामान्य तरीके प्रदान करता है।
* <code>Metaclass</code> सभी मेटाक्लास के लिए सामान्य विधि प्रदान करता है।


चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं:
चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं:


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


== रुबी में ==
== रुबी में ==
रूबी ने विक्षनरी: eigenclasses,
रूबी ईजेनक्लासेस की प्रारंभिक करके, <code>Metaclass</code> क्लास को हटाकर, और (अन) मैप के क्लास को फिर से परिभाषित करके मेटाक्लास की स्मॉलटॉक-80 अवधारणा को शुद्ध करती है। परिवर्तन को निम्नानुसार योजनाबद्ध किया जा सकता है:<ref>{{cite web | url=http://www.atalon.cz/rb-om/ruby-object-model/co-smalltalk/ | title=The Ruby Object Model: Comparison with Smalltalk-80 }}</ref>  
हटा रहा है <code>Metaclass</code> कक्षा,
और (अन) मानचित्र के वर्ग को पुनर्परिभाषित करना।
<!-- -->
परिवर्तन को निम्नानुसार योजनाबद्ध किया जा सकता है:<ref>{{cite web | url=http://www.atalon.cz/rb-om/ruby-object-model/co-smalltalk/ | title=The Ruby Object Model: Comparison with Smalltalk-80 }}</ref>
{| border=0 cellpadding=0 style="margin: 2ex auto"
{| border=0 cellpadding=0 style="margin: 2ex auto"
|-
|-
Line 100: Line 95:
|+ Smalltalk-80
|+ Smalltalk-80
|-
|-
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;"><span style="position:relative; top:1ex;">Classes</span></div>
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;"><span style="position:relative; top:1ex;">कक्षाओं</span></div>
| <div style="height: 5ex; margin:1ex; padding: 1ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''Implicit<br>metaclasses'''</span></div>
| <div style="height: 5ex; margin:1ex; padding: 1ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''अंतर्निहित'''</span><span style="font-size:85%;">'''मेटाक्लासेस'''</span></div>
| rowspan="2" style="width:4ex;" | &nbsp;&nbsp;
| rowspan="2" style="width:4ex;" | &nbsp;&nbsp;
|-
|-
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;">Terminal<br>objects</div>
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;">टर्मिनल
वस्तुओं
</div>
|
|
|}
|}
Line 112: Line 109:
|+ Ruby
|+ Ruby
|-
|-
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;"><span style="position:relative; top:1ex;">Classes</span></div>
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;"><span style="position:relative; top:1ex;">कक्षाओं</span></div>
| <div style="height: 5ex; margin:1ex; padding: 1ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''Eigenclasses of<br>classes'''</span></div>
| <div style="height: 5ex; margin:1ex; padding: 1ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''ईजेनक्लास का'''</span><span style="font-size:85%;">'''कक्षाओं'''</span></div>
| rowspan=2 | <div style="height: 12ex; margin:1ex; padding: 2ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''Eigenclasses<br>of<br>eigenclasses'''</span></div>
| rowspan=2 | <div style="height: 12ex; margin:1ex; padding: 2ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''ईजेनक्लासेस'''</span><span style="font-size:85%;">'''का'''</span>
 
<span style="font-size:85%;">'''ईजेनक्लास'''</span>  
</div>
|-
|-
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;">Terminal<br>objects</div>
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;">टर्मिनल
| <div style="height: 5ex; margin:1ex; padding: 1ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''Eigenclasses of<br>terminal objects'''</span></div>
वस्तुओं
</div>
| <div style="height: 5ex; margin:1ex; padding: 1ex 0.4ex; border: 1px dotted gray;"><span style="font-size:85%;">'''ईजेनक्लास का'''</span><span style="font-size:85%;">'''टर्मिनल ऑब्जेक्ट'''</span></div>
|}
|}
|}
|}
विशेष रूप से स्मॉलटाक के अंतर्निहित मेटाक्लासेस और रूबी के ईजेनक्लास ऑफ क्लासेस के बीच पत्राचार पर ध्यान दें।
विशेष रूप से स्मॉलटाक के अंतर्निहित मेटाक्लासेस और रूबी के ईजेनक्लास ऑफ क्लासेस के बीच पत्राचार पर ध्यान दें। रूबी ईजेनक्लास मॉडल अंतर्निहित मेटाक्लास की अवधारणा को पूरी तरह से एक समान बनाता है: प्रत्येक वस्तु x का अपना मेटा-ऑब्जेक्ट होता है, जिसे x का ईजेनक्लास कहा जाता है, जो x से एक मेटा-स्तर अधिक होता है। उच्च क्रम के ईजेनक्लास सामान्यतः विशुद्ध रूप से वैचारिक रूप से उपस्थित होते हैं - अधिकांश रूबी कार्यक्रमों में उनमें कोई विधियाँ नहीं होती हैं या कोई (अन्य) डेटा संग्रहीत नहीं होता है।<ref>
रूबी eigenclass मॉडल अंतर्निहित मेटाक्लास की अवधारणा को पूरी तरह से एक समान बनाता है: प्रत्येक वस्तु x का अपना मेटा-ऑब्जेक्ट होता है, जिसे x का eigenclass कहा जाता है, जो x से एक मेटा-स्तर अधिक होता है। उच्च क्रम के eigenclasses आमतौर पर विशुद्ध रूप से वैचारिक रूप से मौजूद होते हैं - अधिकांश रूबी कार्यक्रमों में उनमें कोई विधियाँ नहीं होती हैं या कोई (अन्य) डेटा संग्रहीत नहीं होता है।<ref>
{{cite book | publisher=Pragmatic Bookshelf | author=Paolo Perrotta | url=http://pragprog.com/book/ppmetr/metaprogramming-ruby | title=Metaprogramming Ruby | year=2010 | isbn=978-1-934356-47-0}}</ref>
{{cite book | publisher=Pragmatic Bookshelf | author=Paolo Perrotta | url=http://pragprog.com/book/ppmetr/metaprogramming-ruby | title=Metaprogramming Ruby | year=2010 | isbn=978-1-934356-47-0}}</ref>
निम्नलिखित चित्र तुलना में स्मॉलटाक -80 और रूबी की एक नमूना कोर संरचना दिखाते हैं।<ref>{{cite web | url=http://www.atalon.cz/om/object-membership/ | title=Object Membership: The Core Structure of Object Technology }}</ref>
 
दोनों भाषाओं में, संरचना में एक अंतर्निहित भाग होता है जिसमें गोलाकार वस्तुएं होती हैं (अर्थात ऐसी वस्तुएं जो नीले या हरे रंग के लिंक के संयोजन से बने चक्र में दिखाई देती हैं) और एक उपयोगकर्ता-भाग जिसमें चार स्पष्ट वस्तुएं होती हैं: वर्ग <code>A</code> और <code>B</code>
निम्नलिखित चित्र तुलना में स्मॉलटाक -80 और रूबी की एक नमूना कोर संरचना दिखाते हैं।<ref>{{cite web | url=http://www.atalon.cz/om/object-membership/ | title=Object Membership: The Core Structure of Object Technology }}</ref> दोनों भाषाओं में, संरचना में एक अंतर्निहित भाग होता है जिसमें गोलाकार वस्तुएं होती हैं (अर्थात ऐसी वस्तुएं जो नीले या हरे रंग के लिंक के संयोजन से बने चक्र में दिखाई देती हैं) और एक उपयोगकर्ता-भाग जिसमें चार स्पष्ट वस्तुएं होती हैं: वर्ग <code>A</code> और <code>B</code>और टर्मिनल ऑब्जेक्ट्स <code>u</code> और <code>v</code>.हरे रंग के लिंक बच्चे को दिखाते हैं → इनहेरिटेंस के माता-पिता के संबंध (अंतर्निहित ऊपर की दिशा के साथ), नीले लिंक पूरक सदस्य → तात्कालिकता के कंटेनर संबंध दिखाते हैं (x बिंदुओं से एक नीला लिंक x के कम से कम वास्तविक कंटेनर के लिए प्रारंभ बिंदु है विधि लुकअप जब एक्स पर एक विधि प्रयुक्त की जाती है)। ग्रे नोड्स ईजेनक्लास (स्मॉलटाक -80 के स्थिति में उत्तर निहित मेटाक्लासेस) प्रदर्शित करते हैं।
और टर्मिनल ऑब्जेक्ट्स <code>u</code> और <code>v</code>.
हरे रंग के लिंक बच्चे को दिखाते हैं → वंशानुक्रम के माता-पिता के संबंध (अंतर्निहित ऊपर की दिशा के साथ), नीले लिंक पूरक सदस्य → तात्कालिकता के कंटेनर संबंध दिखाते हैं (x बिंदुओं से एक नीला लिंक x के कम से कम वास्तविक कंटेनर के लिए प्रारंभ बिंदु है विधि लुकअप जब एक्स पर एक विधि प्रयुक्त की जाती है)। ग्रे नोड्स eigenclasses (स्मॉलटाक -80 के स्थिति में उत्तर निहित मेटाक्लासेस) प्रदर्शित करते हैं।
{| border=0 cellpadding=0 cellspacing=0 style="margin: 2ex auto"
{| border=0 cellpadding=0 cellspacing=0 style="margin: 2ex auto"
|-
|-
Line 134: Line 133:
||[[File:Ruby-metaclass-sample.svg|500px|Eigenclasses in Ruby - A sample structure]]
||[[File:Ruby-metaclass-sample.svg|500px|Eigenclasses in Ruby - A sample structure]]
|}
|}
दाईं ओर का आरेख रूबी में ईजेनक्लास के [[आलसी मूल्यांकन]] की एक तस्वीर भी प्रदान करता है। <code>v</code> ई> ऑब्जेक्ट में सिंगलटन विधियों को जोड़ने के परिणामस्वरूप इसका ईजेनक्लास मूल्यांकन (आवंटित) हो सकता है <code>v</code>.


रूबी के आत्मनिरीक्षण विधि के अनुसार नामित <code>class</code>,
प्रत्येक वर्ग का वर्ग (और प्रत्येक eigenclass का) है
लगातार <code>Class</code> वर्ग (द्वारा चिह्नित <code>c</code> आरेख में)।
<code>Class</code>, और <code>Struct</code> वे एकमात्र वर्ग हैं जिनके उदाहरण के रूप में कक्षाएं हैं।<ref>{{cite web|title=struct|url=http://ruby-doc.org/core-1.9.3/struct.html|website=Ruby Doc|accessdate=1 May 2015}}</ref> {{Disputed inline|The_Struct_class_in_Ruby|date=May 2015}} का उपवर्गीकरण <code>Class</code> अस्वीकृत है।
<!-- -->
मेटाक्लासेस की मानक परिभाषा के बाद हम यह निष्कर्ष निकाल सकते हैं <code>Class</code> और <code>Struct</code> रूबी में एकमात्र मेटाक्लास हैं।
ऐसा लगता है कि रूबी और स्मॉलटाक के बीच पत्राचार का खंडन करता है,
चूंकि स्मॉलटॉक-80 में, प्रत्येक वर्ग का अपना मेटाक्लास होता है।
विसंगति के बीच असहमति पर आधारित है
<code>class</code> रूबी और स्मॉलटाक में आत्मनिरीक्षण विधि। जबकि नक्शा x ↦ x.<code>class</code> टर्मिनल ऑब्जेक्ट्स पर मेल खाता है, यह कक्षाओं के प्रतिबंध में भिन्न है। जैसा ऊपर बताया गया है, कक्षा के लिए <code>''x''</code>, रूबी अभिव्यक्ति <code>''x''.class</code> के लिए लगातार मूल्यांकन करता है <code>Class</code>. स्मॉलटाक -80 में, अगर <code>''x''</code> एक वर्ग है तो अभिव्यक्ति <code>''x'' class</code> मेल खाती है
रूबी के लिए <code>''x''.singleton_class</code>
- जो के eigenclass का मूल्यांकन करता है <code>''x''</code>.


== उद्देश्य-सी == में
दाईं ओर का चित्र रूबी में ईजेनक्लासेस के आलसी मूल्यांकन की एक तस्वीर भी प्रदान करता है। <code>v</code>.में सिंगलटन विधियों को जोड़ने के परिणामस्वरूप <code>v</code>. ऑब्जेक्ट के ईजेनक्लास का मूल्यांकन (आवंटित) किया जा सकता है।
[[File:Objective-C metaclass.png|thumb|ऑब्जेक्टिव-सी में क्लासेस और मेटाक्लासेस के बीच इनहेरिटेंस और इंस्टेंस रिलेशनशिप का डायग्राम। ध्यान दें कि ऑब्जेक्टिव-सी में कई रूट क्लासेस हैं; प्रत्येक मूल वर्ग का एक अलग पदानुक्रम होगा। यह आरेख केवल एक उदाहरण रूट क्लास NSObject के लिए पदानुक्रम दिखाता है। एक दूसरे रूट क्लास में एक समान पदानुक्रम होगा।]]ऑब्जेक्टिव-सी में मेटाक्लास लगभग स्मॉलटाक -80 के समान हैं-आश्चर्य की बात नहीं है क्योंकि ऑब्जेक्टिव-सी स्मॉलटाक से बहुत कुछ उधार लेता है। स्मॉलटाक की तरह, ऑब्जेक्टिव-सी में, उदाहरण चर और विधियों को ऑब्जेक्ट की कक्षा द्वारा परिभाषित किया जाता है। एक वर्ग एक वस्तु है, इसलिए यह मेटाक्लास का एक उदाहरण है।
 
रूबी की <code>class</code>नाम की आत्मनिरीक्षण विधि के अनुसार, प्रत्येक वर्ग (और प्रत्येक ईजेनक्लास) का वर्ग लगातार <code>class</code>वर्ग होता है (आरेख में <code>c</code> द्वारा दर्शाया गया है)। <code>class</code>और <code>Struct</code> ही एकमात्र ऐसे वर्ग हैं जिनमें उदाहरण के रूप में वर्ग होते हैं।<ref>{{cite web|title=struct|url=http://ruby-doc.org/core-1.9.3/struct.html|website=Ruby Doc|accessdate=1 May 2015}}</ref> वर्ग के उपवर्गीकरण की अनुमति नहीं है। मेटाक्लास की मानक परिभाषा के बाद हम यह निष्कर्ष निकाल सकते हैं कि रूबी में <code>class</code>और <code>Struct</code> ही एकमात्र मेटाक्लास हैं। यह रूबी और स्मॉलटॉक के बीच पत्राचार का खंडन करता प्रतीत होता है, क्योंकि स्मॉलटॉक-80 में, प्रत्येक वर्ग का अपना मेटाक्लास होता है। विसंगति रूबी और स्मॉलटॉक में वर्ग आत्मनिरीक्षण पद्धति के बीच असहमति पर आधारित है। जबकि मानचित्र x ↦ x.<code>class</code>टर्मिनल ऑब्जेक्ट्स पर मेल खाता है, यह कक्षाओं के प्रतिबंध में भिन्न है। जैसा कि ऊपर बताया गया है, <code>class</code><code>''x''</code> के लिए, रूबी एक्सप्रेशन <code>''x''.class</code>लगातार <code>class</code>का मूल्यांकन करता है। स्मॉलटॉक-80 में, यदि x एक वर्ग है तो अभिव्यक्ति <code>''x'' class</code> रूबी के <code>''x''.singleton_class</code> से मेल खाता है - जो <code>''x''</code> के ईजेनक्लास का मूल्यांकन करता है।
 
== उद्देश्य-सी में ==
[[File:Objective-C metaclass.png|thumb|ऑब्जेक्टिव-सी में क्लासेस और मेटाक्लासेस के बीच इनहेरिटेंस और इंस्टेंस रिलेशनशिप का डायग्राम। ध्यान दें कि ऑब्जेक्टिव-सी में कई रूट क्लासेस हैं; प्रत्येक मूल वर्ग का एक अलग पदानुक्रम होगा। यह आरेख केवल एक उदाहरण रूट क्लास NSObject के लिए पदानुक्रम दिखाता है। एक दूसरे रूट क्लास में एक समान पदानुक्रम होगा।]]ऑब्जेक्टिव-सी में मेटाक्लास लगभग स्मॉलटाक -80 के समान हैं-आश्चर्य की बात नहीं है क्योंकि ऑब्जेक्टिव-सी स्मॉलटाक से बहुत कुछ उधार लेता है। स्मॉलटाक की तरह, ऑब्जेक्टिव-सी में, उदाहरण चर और विधियों को ऑब्जेक्ट की क्लास द्वारा परिभाषित किया जाता है। एक वर्ग एक वस्तु है, इसलिए यह मेटाक्लास का एक उदाहरण है।


स्मॉलटाक की तरह, ऑब्जेक्टिव-सी में, क्लास मेथड्स केवल क्लास ऑब्जेक्ट पर कॉल की जाने वाली मेथड्स हैं, इसलिए क्लास के क्लास मेथड्स को इसके मेटाक्लास में इंस्टेंस मेथड्स के रूप में परिभाषित किया जाना चाहिए। क्योंकि अलग-अलग वर्गों में वर्ग विधियों के अलग-अलग सेट हो सकते हैं, प्रत्येक वर्ग का अपना अलग मेटाक्लास होना चाहिए। कक्षाएं और मेटाक्लास हमेशा एक जोड़ी के रूप में बनाए जाते हैं: रनटाइम में कार्य होते हैं <code>objc_allocateClassPair()</code> और <code>objc_registerClassPair()</code> क्रमशः वर्ग-मेटाक्लास जोड़े बनाने और पंजीकृत करने के लिए।
स्मॉलटॉक की तरह, ऑब्जेक्टिव-सी में, क्लास विधियां केवल क्लास ऑब्जेक्ट पर कॉल की जाने वाली विधियां हैं, इसलिए क्लास की क्लास विधियों को इसके मेटाक्लास में इंस्टेंस विधियों के रूप में परिभाषित किया जाना चाहिए। क्योंकि अलग-अलग वर्गों में वर्ग विधियों के अलग-अलग सेट हो सकते हैं, प्रत्येक वर्ग का अपना अलग मेटाक्लास होना चाहिए। कक्षाएं और मेटाक्लास सदैव एक जोड़ी के रूप में बनाए जाते हैं: रनटाइम में क्रमशः क्लास-मेटाक्लास जोड़े बनाने और पंजीकृत करने के लिए <code>objc_allocateClassPair()</code>और <code>objc_registerClassPair()</code>फ़ंक्शन होते हैं।


मेटाक्लासेस के लिए कोई नाम नहीं हैं; हालाँकि, किसी भी वर्ग वस्तु के सूचक को सामान्य प्रकार के साथ संदर्भित किया जा सकता है <code>Class</code> (प्रकार के समान <code>id</code> किसी ऑब्जेक्ट के पॉइंटर के लिए इस्तेमाल किया जा रहा है)।
मेटाक्लासेस के लिए कोई नाम नहीं हैं; चूँकि, किसी भी क्लास ऑब्जेक्ट के पॉइंटर को सामान्य प्रकार <code>Class</code> के साथ संदर्भित किया जा सकता है(प्रकार के समान <code>id</code> किसी ऑब्जेक्ट के पॉइंटर के लिए उपयोग किया जा रहा है)।


क्योंकि वर्ग विधियों को वंशानुक्रम के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि कक्षा A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड़कर।
क्योंकि वर्ग विधियों को इनहेरिटेंस के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि क्लास A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड सकते है।


स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (आमतौर पर <code>NSObject</code> [[कोको (एपीआई)]] ढांचे का उपयोग करके)यह सुनिश्चित करता है कि सभी क्लास ऑब्जेक्ट्स अंततः रूट क्लास के उदाहरण हैं, ताकि आप रूट क्लास के इंस्टेंस विधियों का उपयोग कर सकें, आमतौर पर ऑब्जेक्ट्स के लिए उपयोगी उपयोगिता विधियों, क्लास ऑब्जेक्ट्स पर स्वयं।
स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (सामान्यतः <code>NSObject</code> [[कोको (एपीआई)]] रूपरेखा का उपयोग करके) यह सुनिश्चित करता है कि सभी क्लास ऑब्जेक्ट्स अंततः रूट क्लास के उदाहरण हैं, जिससे आप रूट क्लास के इंस्टेंस विधियों का उपयोग कर सकते है, सामान्यतः क्लास ऑब्जेक्ट पर ऑब्जेक्ट के लिए उपयोगी उपयोगिता विधियाँ होती हैं ।


चूँकि मेटाक्लास ऑब्जेक्ट्स अलग तरह से व्यवहार नहीं करते हैं (आप मेटाक्लास के लिए क्लास मेथड्स नहीं जोड़ सकते हैं, इसलिए मेटाक्लास ऑब्जेक्ट्स में सभी समान तरीके हैं), वे सभी एक ही क्लास के उदाहरण हैं- रूट क्लास के मेटाक्लास (स्मॉलटाक के विपरीत)इस प्रकार, रूट क्लास का मेटाक्लास स्वयं का एक उदाहरण है। इसका कारण यह है कि सभी मेटाक्लास मूल वर्ग से प्राप्त होते हैं; इसलिए, उन्हें रूट क्लास के क्लास मेथड्स को इनहेरिट करना होगा।<ref>[http://cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html Cocoa with Love: What is a meta-class in Objective-C?]</ref>
चूँकि मेटाक्लास ऑब्जेक्ट्स अलग तरह से व्यवहार नहीं करते हैं (आप मेटाक्लास के लिए क्लास मेथड्स नहीं जोड़ सकते हैं, इसलिए मेटाक्लास ऑब्जेक्ट्स में सभी समान विधि हैं), वे सभी एक ही क्लास के उदाहरण हैं- रूट क्लास के मेटाक्लास (स्मॉलटाक के विपरीत) इस प्रकार, रूट क्लास का मेटाक्लास स्वयं का एक उदाहरण है। इसका कारण यह है कि सभी मेटाक्लास मूल वर्ग से प्राप्त होते हैं; इसलिए, उन्हें रूट क्लास के क्लास मेथड्स को इनहेरिट करना होगा।<ref>[http://cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html Cocoa with Love: What is a meta-class in Objective-C?]</ref>




Line 166: Line 156:
निम्नलिखित कुछ सबसे प्रमुख प्रोग्रामिंग लैंग्वेज हैं जो मेटाक्लासेस को सपोर्ट करती हैं।
निम्नलिखित कुछ सबसे प्रमुख प्रोग्रामिंग लैंग्वेज हैं जो मेटाक्लासेस को सपोर्ट करती हैं।
* [[ सामान्य लिस्प ]], [[कॉमन लिस्प ऑब्जेक्ट सिस्टम]] के माध्यम से
* [[ सामान्य लिस्प ]], [[कॉमन लिस्प ऑब्जेक्ट सिस्टम]] के माध्यम से
* [[डेल्फी ([[प्रोग्रामिंग भाषा]])]] और इससे प्रभावित [[ वस्तु पास्कल |वस्तु पास्कल]] के अन्य संस्करण
* डेल्फी ([[प्रोग्रामिंग भाषा]]) और इससे प्रभावित [[ वस्तु पास्कल |वस्तु पास्कल]] के अन्य संस्करण
* [[ग्रूवी (प्रोग्रामिंग भाषा)]]
* [[ग्रूवी (प्रोग्रामिंग भाषा)]]
* [[उद्देश्य सी]]
* [[उद्देश्य सी]]
Line 175: Line 165:
* [[सी ++]] ([[सी ++ 23]] के लिए योजना बनाई गई)<ref>{{cite web|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0707r0.pdf|title=मेटाक्लासेस|author=Herb Sutter|author-link=Herb Sutter}}</ref>
* [[सी ++]] ([[सी ++ 23]] के लिए योजना बनाई गई)<ref>{{cite web|url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0707r0.pdf|title=मेटाक्लासेस|author=Herb Sutter|author-link=Herb Sutter}}</ref>


मेटाक्लास का समर्थन करने वाली कुछ कम व्यापक भाषाओं में [[OpenJava]], OpenC++ (सॉफ़्टवेयर टूल)|OpenC++, [[OpenAda]], [[CorbaScript]], [[ObjVLisp]], [[Object-Z]], [[MODEL-K]], [[XOTcl]], और [[MELDC]] सम्मिलित हैं। इनमें से कई भाषाएँ 1990 के दशक की शुरुआत की हैं और अकादमिक रुचि की हैं।<ref>{{Cite web |url=http://csl.ensm-douai.fr/noury/uploads/1/nouryBouraqadi.Gpce03WorkshopOnRepls.pdf |title=मेटाक्लासेस का उपयोग करके जावा में मिक्सिन्स का कार्यान्वयन|access-date=2007-11-27 |archive-url=https://web.archive.org/web/20071016230949/http://csl.ensm-douai.fr/noury/uploads/1/nouryBouraqadi.Gpce03WorkshopOnRepls.pdf |archive-date=2007-10-16 |url-status=dead }}</ref>
मेटाक्लास का समर्थन करने वाली कुछ कम व्यापक भाषाओं में [[OpenJava|ओपनजावा]], ओपनसी++ (सॉफ़्टवेयर टूल) या ओपनसी++, [[OpenAda|ओपनएडीए]], [[CorbaScript|कॉर्बास्क्रिप्ट]], [[ObjVLisp|ओब्जवीलिस्प]], [[Object-Z|ऑब्जेक्ट-जेड]], [[MODEL-K|मॉडल-के]], [[XOTcl|एक्सओटीसीएल]] , और [[MELDC|एमईएलडीसी]] सम्मिलित हैं। इनमें से कई भाषाएँ 1990 के दशक की प्रारंभ की हैं और अकादमिक रुचि की हैं।<ref>{{Cite web |url=http://csl.ensm-douai.fr/noury/uploads/1/nouryBouraqadi.Gpce03WorkshopOnRepls.pdf |title=मेटाक्लासेस का उपयोग करके जावा में मिक्सिन्स का कार्यान्वयन|access-date=2007-11-27 |archive-url=https://web.archive.org/web/20071016230949/http://csl.ensm-douai.fr/noury/uploads/1/nouryBouraqadi.Gpce03WorkshopOnRepls.pdf |archive-date=2007-10-16 |url-status=dead }}</ref>
[[लॉगटॉक]], [[प्रोलॉग]] का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है।
[[लॉगटॉक]], [[प्रोलॉग]] का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है।


[[ संसाधन विवरण ढांचा | संसाधन विवरण ढांचा]] (RDF) और [[ एकीकृत मॉडलिंग भाषा |एकीकृत मॉडलिंग भाषा]] (UML) दोनों मेटाक्लासेस को सपोर्ट करते हैं।
[[ संसाधन विवरण ढांचा | संसाधन विवरण रूपरेखा]] (आरडीएफ) और [[ एकीकृत मॉडलिंग भाषा |एकीकृत मॉडलिंग भाषा]] (यूएमएल) दोनों मेटाक्लासेस को सपोर्ट करते हैं।


== यह भी देखें ==
== यह भी देखें ==
Line 198: Line 188:
{{Data types}}
{{Data types}}
{{Meta-prefix}}
{{Meta-prefix}}
[[Category: वर्ग (कंप्यूटर प्रोग्रामिंग)]] [[Category: लेख उदाहरण के साथ पायथन (प्रोग्रामिंग भाषा) कोड]]


[[Category: Machine Translated Page]]
[[Category:Collapse templates]]
[[Category:Created On 14/06/2023]]
[[Category:Created On 14/06/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Multi-column templates]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages using div col with small parameter]]
[[Category:Pages with script errors]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Templates using under-protected Lua modules]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia fully protected templates|Div col]]
[[Category:Wikipedia metatemplates]]
[[Category:लेख उदाहरण के साथ पायथन (प्रोग्रामिंग भाषा) कोड]]
[[Category:वर्ग (कंप्यूटर प्रोग्रामिंग)]]

Latest revision as of 18:08, 16 July 2023

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


पायथन उदाहरण

पायथन (प्रोग्रामिंग लैंग्वेज) में, बिल्टिन क्लास type एक मेटाक्लास है।[2][3][4] इस साधारण पायथन वर्ग पर विचार करें:

class Car:
    def __init__(self, make: str, model: str, year: int, color: str):
        self.make = make
        self.model = model
        self.year = year
        self.color = color

    @property
    def description(self) -> str:
        """Return a description of this car."""
        return f"{self.color} {self.make} {self.model}"

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


उपरोक्त उदाहरण में चार विशेषताओं make, model, year, और color. से संबंधित कुछ अनावश्यक कोड सम्मिलित हैं। मेटाक्लास का उपयोग करके इस अतिरेक में से कुछ को समाप्त करना संभव है। पायथन में, मेटाक्लास को सबसे आसानी से typeके उपवर्ग के रूप में परिभाषित किया जाता है।

class AttributeInitType(type):
    def __call__(self, *args, **kwargs):
        """Create a new instance."""

        # First, create the object in the normal default way.
        obj = type.__call__(self, *args)

        # Additionally, set attributes on the new object.
        for name, value in kwargs.items():
            setattr(obj, name, value)

        # Return the new object.
        return obj


यह मेटाक्लास केवल ऑब्जेक्ट निर्माण को ओवरराइड करता है। वर्ग और वस्तु व्यवहार के अन्य सभी पहलुओं को अभी भी typeके आधार पर नियंत्रित किया जाता है।

अब इस मेटाक्लास का उपयोग करने के लिए क्लास Carको फिर से लिखा जा सकता है। पायथन 3 में यह क्लास परिभाषा में "कीवर्ड तर्क" metaclass प्रदान करके किया जाता है:

class Car(object, metaclass=AttributeInitType):
    @property
    def description(self) -> str:
        """Return a description of this car."""
        return " ".join(str(value) for value in self.__dict__.values())

परिणामी वस्तु Car सामान्य रूप से तत्काल किया जा सकता है, किंतु इसमें कई कीवर्ड तर्क सम्मिलित हो सकते हैं:

new_car = Car(make='Toyota', model='Prius', year=2005, color='Green', engine='Hybrid')

स्मॉलटाक -80 में

File:Smalltalk 80 metaclasses.svg
यूएमएल आरेख के रूप में स्मॉलटॉक-80 मेटाक्लास पदानुक्रम
File:Smalltalk metaclass.png
स्मालटाक में वर्गों और मेटाक्लासेस के बीच इनहेरिटेंस और उदाहरण संबंधों का आरेख

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

उदाहरण के रूप से, एक Car ऑब्जेक्ट c क्लास Carका एक उदाहरण है। बदले में, क्लास Carफिर से एक ऑब्जेक्ट है और Carके मेटाक्लास का एक उदाहरण है जिसे Carclass कहा जाता है। मेटाक्लास के नाम में रिक्त स्थान पर ध्यान दें। मेटाक्लास का नाम स्मॉलटॉक एक्सप्रेशन है, जिसका मूल्यांकन करने पर मेटाक्लास ऑब्जेक्ट प्राप्त होता है। इस Car class वर्ग के मूल्यांकन से Car के लिए मेटाक्लास ऑब्जेक्ट प्राप्त होता है जिसका नाम Carclass है (कोई Car class nameका मूल्यांकन करके इसकी पुष्टि कर सकता है जो Carके मेटाक्लास का नाम लौटाता है।)

क्लास विधियाँ वास्तव में मेटाक्लास से संबंधित होती हैं, जैसे इंस्टेंस विधियाँ वास्तव में क्लास से संबंधित होती हैं। जब ऑब्जेक्ट पर एक संदेश भेजा जाता है, तो विधि की खोज Integerमें प्रारंभ होती है। यदि यह नहीं मिलता है तो यह सुपरक्लास श्रृंखला में आगे बढ़ता है, ऑब्जेक्ट पर रुकता है, चाहे वह पाया जाए या नहीं पाया जाता है।

जब कोई संदेश Integerको भेजा जाता है तो विधि की खोज Integer class में शुरू होती है और सुपरक्लास श्रृंखला से Object class. तक आगे बढ़ती है। ध्यान दें कि, अब तक, मेटाक्लास इनहेरिटेंस श्रृंखला बिल्कुल क्लास इनहेरिटेंस श्रृंखला का अनुसरण करती है। लेकिन मेटाक्लास श्रृंखला आगे बढ़ती है क्योंकि Object class. Class का उपवर्ग है। सभी मेटाक्लास क्लास के उपवर्ग हैं।

आरंभिक स्मॉलटाक में, केवल एक मेटाक्लास था जिसे Classकहा जाता था। इसका तात्पर्य यह था कि सभी वर्गों की विधियाँ समान थीं, विशेष रूप से नई वस्तुएँ बनाने की विधि, अर्थातnew। कक्षाओं को अपने स्वयं के विधि और अपने स्वयं के इंस्टेंस वेरिएबल्स (जिसे क्लास इंस्टेंस वेरिएबल्स कहा जाता है और इसे क्लास वेरिएबल्स के साथ भ्रमित नहीं किया जाना चाहिए) की अनुमति देने के लिए, स्मॉलटॉक -80 ने प्रत्येक क्लास C के लिए अपने स्वयं के मेटाक्लास C class की प्रारंभ की। इसका मतलब यह है कि प्रत्येक मेटाक्लास प्रभावी रूप से एक सिंगलटन क्लास है।

चूँकि ऐसी कोई आवश्यकता नहीं है कि मेटाक्लास एक-दूसरे से भिन्न व्यवहार करें, सभी मेटाक्लास केवल एक ही वर्ग के उदाहरण हैं जिन्हें मेटाक्लास कहा जाता है। Metaclass के Metaclassको Metaclass class कहा जाता है जो फिर से Metaclassक्लास का एक उदाहरण है।

स्मॉलटॉक-80 में, प्रत्येक वर्ग (Objectको छोड़कर) में एक सुपरक्लास होता है। सभी मेटाक्लास का अमूर्त सुपरक्लास Classहै, जो कक्षाओं की सामान्य प्रकृति का वर्णन करता है।

मेटाक्लास के लिए सुपरक्लास पदानुक्रम, क्लास Objectको छोड़कर, कक्षाओं के समान है। सभी मेटाक्लास Classके उपवर्ग हैं, इसलिए:

  • Object class superclass == Class.

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

मेटाक्लास पदानुक्रम में कक्षाओं के नाम समान नाम की अवधारणाओं से आसानी से भ्रमित हो जाते हैं। उदाहरण के लिए:

  • Object आधार वर्ग है जो सभी ऑब्जेक्ट के लिए सामान्य विधि प्रदान करता है; "एक वस्तु" एक पूर्णांक, या एक विजेट, या एक Car, आदि है।
  • Class मेटाक्लास का आधार है जो सभी वर्गों के लिए सामान्य तरीके प्रदान करता है (चूँकि यह स्वयं मेटाक्लास नहीं है); "एक वर्ग" Integer, या Widget, या Car इत्यादि जैसा कुछ है।
  • Metaclass सभी मेटाक्लास के लिए सामान्य विधि प्रदान करता है।

चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं:

ऑब्जेक्ट - सभी ऑब्जेक्ट्स के लिए सामान्य व्यवहार, जैसे क्लास एक्सेस
व्यवहार - संकलन विधियों और वस्तुओं को बनाने/चलाने के लिए न्यूनतम अवस्था(कंप्यूटर विज्ञान)
कक्षाविवरण (सार वर्ग) - वर्ग / चर नामकरण, टिप्पणियाँ
वर्ग - समान, अधिक व्यापक, सुपरक्लास की सुविधाएं
मेताक्लास - वर्ग चर प्रारंभ करना, उदाहरण निर्माण संदेश

रुबी में

रूबी ईजेनक्लासेस की प्रारंभिक करके, Metaclass क्लास को हटाकर, और (अन) मैप के क्लास को फिर से परिभाषित करके मेटाक्लास की स्मॉलटॉक-80 अवधारणा को शुद्ध करती है। परिवर्तन को निम्नानुसार योजनाबद्ध किया जा सकता है:[5]

Smalltalk-80
कक्षाओं
अंतर्निहितमेटाक्लासेस
  
टर्मिनल

वस्तुओं

Ruby
कक्षाओं
ईजेनक्लास काकक्षाओं
ईजेनक्लासेसका

ईजेनक्लास

टर्मिनल

वस्तुओं

ईजेनक्लास काटर्मिनल ऑब्जेक्ट

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

निम्नलिखित चित्र तुलना में स्मॉलटाक -80 और रूबी की एक नमूना कोर संरचना दिखाते हैं।[7] दोनों भाषाओं में, संरचना में एक अंतर्निहित भाग होता है जिसमें गोलाकार वस्तुएं होती हैं (अर्थात ऐसी वस्तुएं जो नीले या हरे रंग के लिंक के संयोजन से बने चक्र में दिखाई देती हैं) और एक उपयोगकर्ता-भाग जिसमें चार स्पष्ट वस्तुएं होती हैं: वर्ग A और Bऔर टर्मिनल ऑब्जेक्ट्स u और v.हरे रंग के लिंक बच्चे को दिखाते हैं → इनहेरिटेंस के माता-पिता के संबंध (अंतर्निहित ऊपर की दिशा के साथ), नीले लिंक पूरक सदस्य → तात्कालिकता के कंटेनर संबंध दिखाते हैं (x बिंदुओं से एक नीला लिंक x के कम से कम वास्तविक कंटेनर के लिए प्रारंभ बिंदु है विधि लुकअप जब एक्स पर एक विधि प्रयुक्त की जाती है)। ग्रे नोड्स ईजेनक्लास (स्मॉलटाक -80 के स्थिति में उत्तर निहित मेटाक्लासेस) प्रदर्शित करते हैं।

Smalltalk-80   Ruby
Implicit metaclasses in Smalltalk-80 - A sample structure Eigenclasses in Ruby - A sample structure


दाईं ओर का चित्र रूबी में ईजेनक्लासेस के आलसी मूल्यांकन की एक तस्वीर भी प्रदान करता है। v.में सिंगलटन विधियों को जोड़ने के परिणामस्वरूप v. ऑब्जेक्ट के ईजेनक्लास का मूल्यांकन (आवंटित) किया जा सकता है।

रूबी की classनाम की आत्मनिरीक्षण विधि के अनुसार, प्रत्येक वर्ग (और प्रत्येक ईजेनक्लास) का वर्ग लगातार classवर्ग होता है (आरेख में c द्वारा दर्शाया गया है)। classऔर Struct ही एकमात्र ऐसे वर्ग हैं जिनमें उदाहरण के रूप में वर्ग होते हैं।[8] वर्ग के उपवर्गीकरण की अनुमति नहीं है। मेटाक्लास की मानक परिभाषा के बाद हम यह निष्कर्ष निकाल सकते हैं कि रूबी में classऔर Struct ही एकमात्र मेटाक्लास हैं। यह रूबी और स्मॉलटॉक के बीच पत्राचार का खंडन करता प्रतीत होता है, क्योंकि स्मॉलटॉक-80 में, प्रत्येक वर्ग का अपना मेटाक्लास होता है। विसंगति रूबी और स्मॉलटॉक में वर्ग आत्मनिरीक्षण पद्धति के बीच असहमति पर आधारित है। जबकि मानचित्र x ↦ x.classटर्मिनल ऑब्जेक्ट्स पर मेल खाता है, यह कक्षाओं के प्रतिबंध में भिन्न है। जैसा कि ऊपर बताया गया है, classx के लिए, रूबी एक्सप्रेशन x.classलगातार classका मूल्यांकन करता है। स्मॉलटॉक-80 में, यदि x एक वर्ग है तो अभिव्यक्ति x class रूबी के x.singleton_class से मेल खाता है - जो x के ईजेनक्लास का मूल्यांकन करता है।

उद्देश्य-सी में

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

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

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

मेटाक्लासेस के लिए कोई नाम नहीं हैं; चूँकि, किसी भी क्लास ऑब्जेक्ट के पॉइंटर को सामान्य प्रकार Class के साथ संदर्भित किया जा सकता है(प्रकार के समान id किसी ऑब्जेक्ट के पॉइंटर के लिए उपयोग किया जा रहा है)।

क्योंकि वर्ग विधियों को इनहेरिटेंस के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि क्लास A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड सकते है।

स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (सामान्यतः NSObject कोको (एपीआई) रूपरेखा का उपयोग करके) यह सुनिश्चित करता है कि सभी क्लास ऑब्जेक्ट्स अंततः रूट क्लास के उदाहरण हैं, जिससे आप रूट क्लास के इंस्टेंस विधियों का उपयोग कर सकते है, सामान्यतः क्लास ऑब्जेक्ट पर ऑब्जेक्ट के लिए उपयोगी उपयोगिता विधियाँ होती हैं ।

चूँकि मेटाक्लास ऑब्जेक्ट्स अलग तरह से व्यवहार नहीं करते हैं (आप मेटाक्लास के लिए क्लास मेथड्स नहीं जोड़ सकते हैं, इसलिए मेटाक्लास ऑब्जेक्ट्स में सभी समान विधि हैं), वे सभी एक ही क्लास के उदाहरण हैं- रूट क्लास के मेटाक्लास (स्मॉलटाक के विपरीत) इस प्रकार, रूट क्लास का मेटाक्लास स्वयं का एक उदाहरण है। इसका कारण यह है कि सभी मेटाक्लास मूल वर्ग से प्राप्त होते हैं; इसलिए, उन्हें रूट क्लास के क्लास मेथड्स को इनहेरिट करना होगा।[9]


भाषाओं और उपकरणों में समर्थन

निम्नलिखित कुछ सबसे प्रमुख प्रोग्रामिंग लैंग्वेज हैं जो मेटाक्लासेस को सपोर्ट करती हैं।

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

संसाधन विवरण रूपरेखा (आरडीएफ) और एकीकृत मॉडलिंग भाषा (यूएमएल) दोनों मेटाक्लासेस को सपोर्ट करते हैं।

यह भी देखें

संदर्भ

  1. Ira R. Forman and Scott Danforth (1999). मेटाक्लासेस को काम में लाना. ISBN 0-201-43305-2.
  2. IBM Metaclass programming in Python, parts 1 Archived 2008-09-03 at the Wayback Machine, 2 and 3
  3. Artima Forum: Metaclasses in Python 3.0 (part 1 of 2) (part 2 of 2)
  4. David Mertz. "पायथन मेटाक्लास प्रोग्रामिंग पर एक प्राइमर". ONLamp. Archived from the original on April 30, 2003. Retrieved June 28, 2006.
  5. "The Ruby Object Model: Comparison with Smalltalk-80".
  6. Paolo Perrotta (2010). Metaprogramming Ruby. Pragmatic Bookshelf. ISBN 978-1-934356-47-0.
  7. "Object Membership: The Core Structure of Object Technology".
  8. "struct". Ruby Doc. Retrieved 1 May 2015.
  9. Cocoa with Love: What is a meta-class in Objective-C?
  10. Herb Sutter. "मेटाक्लासेस" (PDF).
  11. "मेटाक्लासेस का उपयोग करके जावा में मिक्सिन्स का कार्यान्वयन" (PDF). Archived from the original (PDF) on 2007-10-16. Retrieved 2007-11-27.