Кіріспе

Метакласс кластардың жалпы мінез-құлқын сипаттайды, кластың объектілер үшін жасайтыны сияқты. Объектіге бағытталған бағдарламалауда метакласс – инстанциялары да кластар болатын класс. Қалыпты класс белгілі бір объектілердің мінез-құлқын анықтайтыны сияқты, метакласс белгілі бір кластар мен олардың инстанцияларының мінез-құлқын анықтайды. Барлық объектіге бағытталған бағдарламалау тілдері метакласс қолдамайды. Ондай тілдердің арасында метакласс кластың мінез-құлқының кез келген аспектісін өзгерте алатын деңгейі әртүрлі. Метакласс кластардың бірінші дәрежелі объектілер болуы арқылы іске асырылуы мүмкін, онда метакласс – кластарды құрастыратын қарапайым объект болып табылады. Әрбір тілдің өзінің метаобъект протоколы бар, ол объектілер, кластар және метакласс арасындағы өзара әрекеттесуді реттейтін ережелер жиынтығы. Мысалы, метакласс кодты автоматты түрде жасау үшін немесе құлшақтарды (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-тан айырмашылығы). Осылайша, тамыр кластың метакласы – өзінің инстанциясы. Бұның себебі – барлық метакластар тамыр кластан мұра алады, демек, олар тамыр кластың кластық әдістерін мұраға алуы керек.