Кіріспе
Метакласс кластардың жалпы мінез-құлқын сипаттайды, кластың объектілер үшін жасайтыны сияқты. Объектіге бағытталған бағдарламалауда метакласс – инстанциялары да кластар болатын класс. Қалыпты класс белгілі бір объектілердің мінез-құлқын анықтайтыны сияқты, метакласс белгілі бір кластар мен олардың инстанцияларының мінез-құлқын анықтайды. Барлық объектіге бағытталған бағдарламалау тілдері метакласс қолдамайды. Ондай тілдердің арасында метакласс кластың мінез-құлқының кез келген аспектісін өзгерте алатын деңгейі әртүрлі. Метакласс кластардың бірінші дәрежелі объектілер болуы арқылы іске асырылуы мүмкін, онда метакласс – кластарды құрастыратын қарапайым объект болып табылады. Әрбір тілдің өзінің метаобъект протоколы бар, ол объектілер, кластар және метакласс арасындағы өзара әрекеттесуді реттейтін ережелер жиынтығы. Мысалы, метакласс кодты автоматты түрде жасау үшін немесе құлшақтарды (frameworks) әзірлеуде қолданылуы мүмкін.
In object oriented programming, a metaclass is a class whose instances are also classes. Just as an ordinary class defines the behavior of certain objects, a metaclass defines the behavior of certain classes and their instances. Not all object oriented programming languages support metaclasses. Among those that do, the extent to which metaclasses can override any given aspect of class behavior varies. Metaclasses can be implemented by having classes be first class citizens, in which case a metaclass is simply an object that constructs classes. Each language has its own metaobject protocol, a set of rules that govern how objects, classes, and metaclasses interact. Metaclasses can be used, for example, to generate code automatically, or in developing frameworks.
C мақсатта
C мақсаттағы метакластар Smalltalk 80-дегілермен шамалы ғана ерекшеленеді, бұл таңқалуға орайлы емес, себебі C мақсаты Smalltalk-тан көптеген нәрселерді қабылдаған. Smalltalk сияқты, C мақсатында да объектінің айнымалылары мен әдістері оның класы арқылы анықталады. Клас – объект, сондықтан ол метакластың инстанциясы болып табылады. Smalltalk сияқты, C мақсатында кластық әдістер – жай ғана кластық объектіге шақырылған әдістер, демек, кластың кластық әдістері оның метакласында инстанция әдістері ретінде анықталуы керек. Әртүрлі кластарда әртүрлі кластық әдістер жиынтығы болуы мүмкін, сондықтан әр кластың өзіне тән метакласы болуы тиіс. Кластар мен метакластар әрқашан жұп ретінде жасалады: орындалу кезінде objc_allocateClassPair және objc_registerClassPair функциялары кластың метаклас жұптарын жасау және тіркеу үшін қолданылады. Метакластардың атаулары жоқ; алайда, кез келген кластық объектіге сілтеме жасау үшін жалпы типті Class қолдануға болады (бұл кез келген объектіге сілтеме жасау үшін қолданылатын id типіне ұқсас). Smalltalk сияқты, кластық әдістер мұрагерлік арқылы мұраға беріледі, сондықтан метакластар кластардың мұрагерлік схемасын, тамыр класынан басқа, қайталай білуі керек (мысалы, егер A класының бас класы B класы болса, онда A метакласының бас класы B метакласы болады). Smalltalk-тан айырмашылығы, тамыр кластың метакласы тамыр класының өзінен (әдетте Cocoa framework-ті пайдаланатын NSObject) мұра етеді. Бұл барлық кластық объектілердің түпкілікті тамыр кластың инстанциялары екендігін қамтамасыз етеді, сондықтан сіз тамыр кластың инстанция әдістерін, әдетте нысандар үшін пайдалы қосымша әдістерді, кластық объектілердің өзінде қолдана аласыз. Метакластың объектілері басқаша мінез танытпайды (метакласқа кластық әдістерді қосуға болмайды, сондықтан метакластың барлық объектілерінің бірдей әдістері бар), сондықтан олардың барлығы бір кластың инстанциясы – тамыр кластың метакласы (Smalltalk-тан айырмашылығы). Осылайша, тамыр кластың метакласы – өзінің инстанциясы. Бұның себебі – барлық метакластар тамыр кластан мұра алады, демек, олар тамыр кластың кластық әдістерін мұраға алуы керек.