मेटाक्लास

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

रुबी में
रूबी ने विक्षनरी: eigenclasses, हटा रहा है  कक्षा, और (अन) मानचित्र के वर्ग को पुनर्परिभाषित करना।

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

रूबी के आत्मनिरीक्षण विधि के अनुसार नामित , प्रत्येक वर्ग का वर्ग (और प्रत्येक eigenclass का) है लगातार  वर्ग (द्वारा चिह्नित   आरेख में)। , और  वे एकमात्र वर्ग हैं जिनके उदाहरण के रूप में कक्षाएं हैं।  का उपवर्गीकरण   अस्वीकृत है।

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

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

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

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

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

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

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

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

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

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

यह भी देखें

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