Как концепция, superclass
является родителем класса объекта. то есть класс на один уровень выше в иерархии классов, чем класс текущего объекта.
Как именованный метод, он возвращает имя непосредственного суперкласса получателя.
например он определен в Squeak Smalltalk (а также в его производных, Pharo и Cuis) как
superclass
"Answer the receiver's superclass, a Class."
^superclass
В Dolphin Smalltalk это определяется как
`суперкласс
«Ответ, который является непосредственным получателем
суперкласс (или если его нет). "
^superclass'
Но - каждый класс в иерархии классов на самом деле является экземпляром своего родительского класса. Таким образом, класс, экземпляром которого является данный класс, является метаклассом класса.
Так, например,
aSortedCollection является объектом - экземпляром класса SortedCollection.
SortedCollection - это класс с именем Class 'SortedCollection' в доступной для просмотра иерархии классов. Одновременно это также экземпляр Metaclass - анонимного класса, который имеет экземпляр одноэлементного объекта, который является именованным классом. Именованный класс виден в иерархии классов, но метакласс (будучи анонимным) гораздо менее видимым. Это так, что Smalltalk
Smalltalk поддерживает иерархию метаклассов, то есть иерархию классов классов. Он гораздо менее видим, поскольку он хранится как анонимные системные объекты, но вы можете найти верхний уровень иерархии метаклассов в браузере классов. И класс Class
, и класс Metaclass
должны быть найдены как подклассы класса Behaviour
, который сам является подклассом класса Object
.
Одна из причин, по которой люди говорят, что «в Smalltalk все является объектом», заключается в том, что класс Object
является корнем всех других классов и объектов - он находится на самой вершине иерархии объектов, которая содержит класс иерархия и иерархия метаклассов.
(Обычно на этой стадии мой мозг начинает кровоточить из моих ушей, но следующие 3 пункта помогают отодвинуть все это назад к моему черепу)
Если вы отправите сообщение anInstanceOfAClass class
- вы получите
Возвращается класс объекта anInstanceOfAClass.
Если вы отправите сообщение anInstanceOfAClass class superclass
- вы получите
родительский класс класса объекта anInstanceOfAClass возвращается.
Если вы отправите сообщение anInstanceOfAClass class class
- вы получите
возвращен анонимный одноэлементный метакласс класса объекта anInstanceOfAClass.