मेटाक्लास: Difference between revisions
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}}[[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग | ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, एक मेटाक्लास एक [[ कक्षा (कंप्यूटर विज्ञान) | | {{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>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>Integer</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>Metaclass</code> के <code>Metaclass</code>को <code>Metaclass class</code> कहा जाता है जो फिर से <code>Metaclass</code>क्लास का एक उदाहरण है। | ||
स्मॉलटॉक-80 में, प्रत्येक वर्ग (<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>Object</code> आधार वर्ग है जो सभी | *<code>Object</code> आधार वर्ग है जो सभी ऑब्जेक्ट के लिए सामान्य विधि प्रदान करता है; "एक वस्तु" एक पूर्णांक, या एक विजेट, या एक <code>Car</code>, आदि है। | ||
* <code>Class</code> मेटाक्लास का आधार है जो सभी वर्गों के लिए सामान्य तरीके प्रदान करता है ( | *<code>Class</code> मेटाक्लास का आधार है जो सभी वर्गों के लिए सामान्य तरीके प्रदान करता है (चूँकि यह स्वयं मेटाक्लास नहीं है); "एक वर्ग" <code>Integer</code>, या <code>Widget</code>, या <code>Car</code> इत्यादि जैसा कुछ है। | ||
* <code>Metaclass</code> सभी मेटाक्लास के लिए सामान्य | * <code>Metaclass</code> सभी मेटाक्लास के लिए सामान्य विधि प्रदान करता है। | ||
चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं: | चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं: | ||
:ऑब्जेक्ट - सभी ऑब्जेक्ट्स के लिए सामान्य व्यवहार, जैसे क्लास एक्सेस | :ऑब्जेक्ट - सभी ऑब्जेक्ट्स के लिए सामान्य व्यवहार, जैसे क्लास एक्सेस | ||
:: व्यवहार - [[संकलन]] विधियों और वस्तुओं को बनाने/चलाने के लिए न्यूनतम [[राज्य (कंप्यूटर विज्ञान)]]। | :: व्यवहार - [[संकलन]] विधियों और वस्तुओं को बनाने/चलाने के लिए न्यूनतम [[राज्य (कंप्यूटर विज्ञान)|अवस्था(कंप्यूटर विज्ञान)]]। | ||
::: | :::कक्षाविवरण ([[सार वर्ग]]) - वर्ग / चर नामकरण, टिप्पणियाँ | ||
::::वर्ग - समान, अधिक व्यापक, सुपरक्लास की सुविधाएं | ::::वर्ग - समान, अधिक व्यापक, सुपरक्लास की सुविधाएं | ||
:::: | ::::मेताक्लास - वर्ग चर प्रारंभ करना, उदाहरण निर्माण संदेश | ||
== रुबी में == | == रुबी में == | ||
रूबी | रूबी ईजेनक्लासेस की प्रारंभिक करके, <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> | ||
और (अन) | |||
परिवर्तन को निम्नानुसार योजनाबद्ध किया जा सकता है:<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;"> | | <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%;">''' | | <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;" | | | rowspan="2" style="width:4ex;" | | ||
|- | |- | ||
| <div style="height: 5ex; margin:1ex; padding: 1ex; border: 1px dotted gray;"> | | <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;"> | | <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%;">''' | | <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%;">''' | | 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;"> | | <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%;">''' | वस्तुओं | ||
</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> | ||
रूबी | |||
{{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>. | |||
हरे रंग के लिंक बच्चे को दिखाते हैं → | |||
{| 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>. ऑब्जेक्ट के ईजेनक्लास का मूल्यांकन (आवंटित) किया जा सकता है। | ||
[[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>Class</code> के साथ संदर्भित किया जा सकता है(प्रकार के समान <code>id</code> किसी ऑब्जेक्ट के पॉइंटर के लिए उपयोग किया जा रहा है)। | ||
क्योंकि वर्ग विधियों को | क्योंकि वर्ग विधियों को इनहेरिटेंस के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि क्लास A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड सकते है। | ||
स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास ( | स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (सामान्यतः <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> | ||
| 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]], | मेटाक्लास का समर्थन करने वाली कुछ कम व्यापक भाषाओं में [[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> | ||
[[लॉगटॉक]], [[प्रोलॉग]] का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है। | [[लॉगटॉक]], [[प्रोलॉग]] का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है। | ||
[[ संसाधन विवरण ढांचा | संसाधन विवरण | [[ संसाधन विवरण ढांचा | संसाधन विवरण रूपरेखा]] (आरडीएफ) और [[ एकीकृत मॉडलिंग भाषा |एकीकृत मॉडलिंग भाषा]] (यूएमएल) दोनों मेटाक्लासेस को सपोर्ट करते हैं। | ||
== यह भी देखें == | == यह भी देखें == | ||
| Line 198: | Line 188: | ||
{{Data types}} | {{Data types}} | ||
{{Meta-prefix}} | {{Meta-prefix}} | ||
[[Category: | [[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 में
स्मॉलटाक में, सब कुछ एक वस्तु (कंप्यूटर विज्ञान) है। इसके अतिरिक्त स्मॉलटाक एक क्लास आधारित प्रोग्रामिंग सिस्टम है, जिसका अर्थ है कि प्रत्येक वस्तु में एक वर्ग होता है जो उस वस्तु की संरचना को परिभाषित करता है (अर्थात वस्तु के उदाहरण चर) और संदेश एक वस्तु को समझता है। साथ में इसका तात्पर्य है कि स्मॉलटाक में एक वर्ग एक वस्तु है और इसलिए एक वर्ग को एक वर्ग (मेटाक्लास कहा जाता है) का एक उदाहरण होना चाहिए।
उदाहरण के रूप से, एक 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]
|
→ |
|
विशेष रूप से स्मॉलटाक के अंतर्निहित मेटाक्लासेस और रूबी के ईजेनक्लास ऑफ क्लासेस के बीच पत्राचार पर ध्यान दें। रूबी ईजेनक्लास मॉडल अंतर्निहित मेटाक्लास की अवधारणा को पूरी तरह से एक समान बनाता है: प्रत्येक वस्तु x का अपना मेटा-ऑब्जेक्ट होता है, जिसे x का ईजेनक्लास कहा जाता है, जो x से एक मेटा-स्तर अधिक होता है। उच्च क्रम के ईजेनक्लास सामान्यतः विशुद्ध रूप से वैचारिक रूप से उपस्थित होते हैं - अधिकांश रूबी कार्यक्रमों में उनमें कोई विधियाँ नहीं होती हैं या कोई (अन्य) डेटा संग्रहीत नहीं होता है।[6]
निम्नलिखित चित्र तुलना में स्मॉलटाक -80 और रूबी की एक नमूना कोर संरचना दिखाते हैं।[7] दोनों भाषाओं में, संरचना में एक अंतर्निहित भाग होता है जिसमें गोलाकार वस्तुएं होती हैं (अर्थात ऐसी वस्तुएं जो नीले या हरे रंग के लिंक के संयोजन से बने चक्र में दिखाई देती हैं) और एक उपयोगकर्ता-भाग जिसमें चार स्पष्ट वस्तुएं होती हैं: वर्ग A और Bऔर टर्मिनल ऑब्जेक्ट्स u और v.हरे रंग के लिंक बच्चे को दिखाते हैं → इनहेरिटेंस के माता-पिता के संबंध (अंतर्निहित ऊपर की दिशा के साथ), नीले लिंक पूरक सदस्य → तात्कालिकता के कंटेनर संबंध दिखाते हैं (x बिंदुओं से एक नीला लिंक x के कम से कम वास्तविक कंटेनर के लिए प्रारंभ बिंदु है विधि लुकअप जब एक्स पर एक विधि प्रयुक्त की जाती है)। ग्रे नोड्स ईजेनक्लास (स्मॉलटाक -80 के स्थिति में उत्तर निहित मेटाक्लासेस) प्रदर्शित करते हैं।
| Smalltalk-80 | Ruby | |
दाईं ओर का चित्र रूबी में ईजेनक्लासेस के आलसी मूल्यांकन की एक तस्वीर भी प्रदान करता है। 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 के ईजेनक्लास का मूल्यांकन करता है।
उद्देश्य-सी में
ऑब्जेक्टिव-सी में मेटाक्लास लगभग स्मॉलटाक -80 के समान हैं-आश्चर्य की बात नहीं है क्योंकि ऑब्जेक्टिव-सी स्मॉलटाक से बहुत कुछ उधार लेता है। स्मॉलटाक की तरह, ऑब्जेक्टिव-सी में, उदाहरण चर और विधियों को ऑब्जेक्ट की क्लास द्वारा परिभाषित किया जाता है। एक वर्ग एक वस्तु है, इसलिए यह मेटाक्लास का एक उदाहरण है।
स्मॉलटॉक की तरह, ऑब्जेक्टिव-सी में, क्लास विधियां केवल क्लास ऑब्जेक्ट पर कॉल की जाने वाली विधियां हैं, इसलिए क्लास की क्लास विधियों को इसके मेटाक्लास में इंस्टेंस विधियों के रूप में परिभाषित किया जाना चाहिए। क्योंकि अलग-अलग वर्गों में वर्ग विधियों के अलग-अलग सेट हो सकते हैं, प्रत्येक वर्ग का अपना अलग मेटाक्लास होना चाहिए। कक्षाएं और मेटाक्लास सदैव एक जोड़ी के रूप में बनाए जाते हैं: रनटाइम में क्रमशः क्लास-मेटाक्लास जोड़े बनाने और पंजीकृत करने के लिए objc_allocateClassPair()और objc_registerClassPair()फ़ंक्शन होते हैं।
मेटाक्लासेस के लिए कोई नाम नहीं हैं; चूँकि, किसी भी क्लास ऑब्जेक्ट के पॉइंटर को सामान्य प्रकार Class के साथ संदर्भित किया जा सकता है(प्रकार के समान id किसी ऑब्जेक्ट के पॉइंटर के लिए उपयोग किया जा रहा है)।
क्योंकि वर्ग विधियों को इनहेरिटेंस के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि क्लास A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड सकते है।
स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (सामान्यतः NSObject कोको (एपीआई) रूपरेखा का उपयोग करके) यह सुनिश्चित करता है कि सभी क्लास ऑब्जेक्ट्स अंततः रूट क्लास के उदाहरण हैं, जिससे आप रूट क्लास के इंस्टेंस विधियों का उपयोग कर सकते है, सामान्यतः क्लास ऑब्जेक्ट पर ऑब्जेक्ट के लिए उपयोगी उपयोगिता विधियाँ होती हैं ।
चूँकि मेटाक्लास ऑब्जेक्ट्स अलग तरह से व्यवहार नहीं करते हैं (आप मेटाक्लास के लिए क्लास मेथड्स नहीं जोड़ सकते हैं, इसलिए मेटाक्लास ऑब्जेक्ट्स में सभी समान विधि हैं), वे सभी एक ही क्लास के उदाहरण हैं- रूट क्लास के मेटाक्लास (स्मॉलटाक के विपरीत) इस प्रकार, रूट क्लास का मेटाक्लास स्वयं का एक उदाहरण है। इसका कारण यह है कि सभी मेटाक्लास मूल वर्ग से प्राप्त होते हैं; इसलिए, उन्हें रूट क्लास के क्लास मेथड्स को इनहेरिट करना होगा।[9]
भाषाओं और उपकरणों में समर्थन
निम्नलिखित कुछ सबसे प्रमुख प्रोग्रामिंग लैंग्वेज हैं जो मेटाक्लासेस को सपोर्ट करती हैं।
- सामान्य लिस्प , कॉमन लिस्प ऑब्जेक्ट सिस्टम के माध्यम से
- डेल्फी (प्रोग्रामिंग भाषा) और इससे प्रभावित वस्तु पास्कल के अन्य संस्करण
- ग्रूवी (प्रोग्रामिंग भाषा)
- उद्देश्य सी
- पायथन (प्रोग्रामिंग भाषा)
- पर्ल, मेटाक्लास प्रगमा के साथ-साथ मूस (पर्ल)
- रूबी (प्रोग्रामिंग भाषा)
- गपशप
- सी ++ (सी ++ 23 के लिए योजना बनाई गई)[10]
मेटाक्लास का समर्थन करने वाली कुछ कम व्यापक भाषाओं में ओपनजावा, ओपनसी++ (सॉफ़्टवेयर टूल) या ओपनसी++, ओपनएडीए, कॉर्बास्क्रिप्ट, ओब्जवीलिस्प, ऑब्जेक्ट-जेड, मॉडल-के, एक्सओटीसीएल , और एमईएलडीसी सम्मिलित हैं। इनमें से कई भाषाएँ 1990 के दशक की प्रारंभ की हैं और अकादमिक रुचि की हैं।[11] लॉगटॉक, प्रोलॉग का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है।
संसाधन विवरण रूपरेखा (आरडीएफ) और एकीकृत मॉडलिंग भाषा (यूएमएल) दोनों मेटाक्लासेस को सपोर्ट करते हैं।
यह भी देखें
संदर्भ
- ↑ Ira R. Forman and Scott Danforth (1999). मेटाक्लासेस को काम में लाना. ISBN 0-201-43305-2.
- ↑ IBM Metaclass programming in Python, parts 1 Archived 2008-09-03 at the Wayback Machine, 2 and 3
- ↑ Artima Forum: Metaclasses in Python 3.0 (part 1 of 2) (part 2 of 2)
- ↑ David Mertz. "पायथन मेटाक्लास प्रोग्रामिंग पर एक प्राइमर". ONLamp. Archived from the original on April 30, 2003. Retrieved June 28, 2006.
- ↑ "The Ruby Object Model: Comparison with Smalltalk-80".
- ↑ Paolo Perrotta (2010). Metaprogramming Ruby. Pragmatic Bookshelf. ISBN 978-1-934356-47-0.
- ↑ "Object Membership: The Core Structure of Object Technology".
- ↑ "struct". Ruby Doc. Retrieved 1 May 2015.
- ↑ Cocoa with Love: What is a meta-class in Objective-C?
- ↑ Herb Sutter. "मेटाक्लासेस" (PDF).
- ↑ "मेटाक्लासेस का उपयोग करके जावा में मिक्सिन्स का कार्यान्वयन" (PDF). Archived from the original (PDF) on 2007-10-16. Retrieved 2007-11-27.