1.2. Смолтоковская реализация ООМП 23
мы. Подобно тому, как объекты создаются из классов, так и сами классы
должны рассматриваться в языке как объекты, создаваемые в соответствии
с шаблоном, представленным некоторым классом. Такой класс для класса
называется метаклассом данного класса. При этом класс — единственный
экземпляр своего метакласса. В языке Смолток метакласс, в отличие от
класса, не имеет имени, и доступ к нему осуществляется посылкой классу
сообщения class. Например, пошлем сообщение class классу Float, то есть
выполним выражение Float class. В ответ класс Float должен вернуть имя
класса, экземпляром которого он является, то есть имя своего метакласса,
но поскольку у метаклассов нет имен, будет про сто возвращено Float class.
Таким образом, мы можем сделать очень важный для дальнейшего вы-
вод о том, что в системе Смолток есть два вида объектов: те, которые могут
создавать экземпляры, и те, которые не могут этого делать.
Метакласс — тоже класс системы и должен подчиняться всем правилам,
имеющим место для классов, а значит, входить в иерархию классов. Но ка-
кое место он должен занимать в иерархии? Первое и совершенно очевидное
правило состоит в том, что приведенная выше иерархия классов должна со-
храняться и для их метаклассов. То есть если Класс1 есть подкласс Класс2,
то метакласс Класс1 есть подкласс метакласса Класс2. Второе правило вы-
текает из общего принципа построения системы Смолток, согласно которо-
му любой метакласс в системе, являясь ее объектом, должен быть экзем-
пляром некоторого класса. Таким классом является класс MetaСlass: любой
метакласс системы есть экземпляр класса MetaСlass, который, являясь шаб-
лоном для метаклассов, описывает наиболее общие свойства тех объектов,
которые умеют создавать единственный объект-класс.
Для завершения построения системы остается только связать между
собой иерархию классов и метаклассов. Чтобы это сделать, вспомним,
что базовым классом иерархии является класс Object, который сам не
имеет суперкласса. Но класс Object, согласно предыдущему, имеет свой
метакласс Object class, который, с одной стороны, есть экземпляр клас-
са MetaСlass, как и все другие метаклассы системы, а с другой стороны,
является «базовым» классом иерархии метаклассов и, согласно принципу
наследования при построении иерархии, определяет общую структуру и
поведение всех экземпляров метаклассов, то есть классов. Для отражения
этой роли метакласса Object class в системе Смолток создан класс с име-
нем Class, который является суперклассом для Object class. Таким образом,
все метаклассы являются подклассами класса с именем Class, одновремен-
но являясь экземплярами класса MetaСlass.
Такое строение иерархии классов имеет одно очень важное следствие:
цепочки суперк лассов для самого класса и для его метакласса разные. На-