Короткий ответ: «Ваше предположение, что классы являются экземплярами общесистемного класса, неверно, каждый класс на самом деле является экземпляром специфичного для класса метакласса», а также «он не будет работать по-другому».
Небольшое изменение в ответе: «имена действительно сбивают с толку, иногда проще просто запомнить их роли и не пытаться слишком много думать о том, как они работают».
Короткий волосатый ответ:
Метакласс является экземпляром, как и все другие обычные классы Smalltalk, и для него требуется собственный выделенный класс. Каждый экземпляр обычного объекта Smalltalk имеет класс, наследование которого следует иерархии классов. Каждый класс сам является экземпляром специфичного для класса метакласса с наследованием в соответствии с иерархией метакласса. Каждый метакласс сам по себе является экземпляром класса Metaclass, который замыкается виртуальной машиной в изящной маленькой хитрости, так как никто не нашел применения, чтобы дать классу Metaclass родительский класс, и все те, кто пытался, обычно находили, что их здравомыслие начало разрушаться в процессе.
Длиннее, все еще волосатый ответ:
Smalltalk позволяет каждому классу содержать сообщения, специфичные для класса. Это примерно эквивалентно статическим методам в Java, но с некоторыми существенными отличиями. Одно из этих отличий состоит в том, что классы Smalltalk на самом деле являются объектами, созданными на основе экземпляра, - это живые объекты в системе, обладающие возможностью наследовать от других объектов и содержать переменные экземпляра.
Это свойство приводит к потенциальному множеству иерархий наследования в системе. Каждый из обычных объектов является экземплярами ровно одного класса, с сообщениями, посылаемыми объектам, которые ищут класс объектов, а затем следуют по цепочке наследования иерархии классов. Сообщения, отправляемые обычным объектам, разрешаются в иерархии классов.
Кроме того, каждый объект класса является экземпляром одного специфического для класса метакласса. Сообщения, отправленные объекту класса, разрешаются путем поиска в метаклассе, специфичном для класса, а затем в иерархии метакласса вверх.
Еще один слой, каждый из объектов метакласса, является экземпляром уникального общесистемного класса метакласса. Сообщения, отправляемые объекту метакласса, просматриваются в общесистемном уникальном метаклассе, который не может наследоваться от кого-либо и который запрограммирован как короткое замыкание в ВМ.
Технически, система имеет две иерархии наследования и третью, имитирующую короткое замыкание. Нет никакой теоретической причины останавливаться на двух, хотя есть много практических. Это позволяет каждому объекту иметь свои собственные, уникальные объекты, сообщения, каждый класс имеет свои собственные, уникальные классы, сообщения и заставляет все метаклассы отвечать только на один набор сообщений, определенный в метаклассе.
Аккуратно, да?