मेटाक्लास

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

मेटाक्लास का समर्थन करने वाली कुछ कम व्यापक भाषाओं में OpenJava, OpenC++ (सॉफ़्टवेयर टूल)|OpenC++, OpenAda, CorbaScript, ObjVLisp, Object-Z, MODEL-K, XOTcl, और MELDC सम्मिलित हैं। इनमें से कई भाषाएँ 1990 के दशक की प्रारंभ की हैं और अकादमिक रुचि की हैं। लॉगटॉक, प्रोलॉग का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है।

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

यह भी देखें

 * मेटामॉडलिंग
 * मेटाप्रोग्रामिंग
 * मेटाऑब्जेक्ट
 * दयालु (प्रकार सिद्धांत)
 * प्रतिबिंब (कंप्यूटर विज्ञान)
 * गतिशीलता (कम्प्यूटिंग)
 * एडेप्टर पैटर्न
 * मेटाक्लास (सिमेंटिक वेब)
 * मेटाक्लास क्या है?