Метакласс


Метакласс (англ. Metaclass) — в объектно-ориентированном программировании это класс, экземпляры которого в свою очередь являются классами[1][2].

Не все объектно-ориентированные языки программирования поддерживают метаклассы. Те из них, что поддерживают, реализуют разный подход со своими собственным протоколом, правилами создания и обращения[3].

Кроме того, существует целый ряд узкоспециализированных, особенно так называемых «академических» языков программирования, поддерживающих и исследующих концепцию метаклассов[4].

Особняком стоит Java, где также есть единственный метакласс — Class (описывает классы), который располагается в библиотеке java.lang. Однако, развитой концепции работы с метаклассами Java не предоставляет.

Метаклассы могут существовать не только как сущность языка программирования, но и как сущность многоязыковой платформы. Наиболее явно метаклассы выражены в IBM System Object Model. Архитекторы SOM учитывали положительные стороны CLOS и решили один из её недостатков, несовместимость метаклассов, уникальным на то время способом. Несовместимость метаклассов — это ситуация, когда метакласс подкласса не является подклассом метакласса. В CLOS это приводит к аварийному завершению. Ситуация может возникнуть, когда разные части системы разрабатываются разными командами, и структура классов одной части системы изменилась, а в другой части системы эти изменения не синхронизированы. Одной из целей SOM являлось обеспечение максимальной совместимости на бинарном уровне между релизами. Инновационным решением, введённым в SOM 2.0 является создание анонимного подкласса нескольких метаклассов в случае, если ни один из метаклассов класса не является подклассом для остальных. В CLOS и SOM 1.0 указание метакласса является требованием. В SOM 2.0 указание метакласса является пожеланием, а реальный метакласс может быть создан во время исполнения, наследуясь от нескольких родителей: от желаемого метакласса, а также от метаклассов каждого надкласса.

Явные метаклассы указываются при объявлении класса. Разработчик, имея возможность явно указать метакласс, может создавать произвольно сложные иерархии.