Суперкласс Smalltalk против метакласса? - PullRequest
6 голосов
/ 25 января 2010

Я новичок в ООП, но с "процедурным" фоном.

В настоящее время я пытаюсь разобраться с ООП с помощью GNU Smalltalk и Lovetalk "Smalltalk: Получение сообщения".

Я запутался в том, что, черт возьми, метакласс и класс метаклассов против суперкласса. Я вижу поток наследования суперкласса -> класса -> подкласса; но я не понимаю, как / где метакласс вписывается. TIA ...

Ответы [ 4 ]

6 голосов
/ 25 января 2010

В бесплатной онлайн-книге есть отличное описание Pharo by Example , глава 13 (Классы и метаклассы). Вещи, описанные в этой главе, являются общими для всех реализаций Smalltalk.

4 голосов
/ 25 января 2010

На самом деле существует два уровня наследования: наследование экземпляра и наследование класса.

Smalltalk имеет специальную схему, которая позволяет передавать классы как объекты. Это означает, что классы также являются объектами в своих собственных правах. Метакласс - это «просто» класс объекта класса.

Он не мешает нормальному наследованию экземпляров, поэтому он не помещается нигде на диаграмме superclass -> class -> subclass, которую вы использовали.

3 голосов
/ 02 февраля 2010

Существует два различных отношения в ОО на основе классов: создание экземпляров и наследование .

Реализация - это отношение между объектом и его классом , ключевым словом new и т. Д. Обычно оно реализуется указателем в низкоуровневом представлении любого объекта. В Smalltalk anObject class пересекает этот указатель; бывает также, что классы также являются объектами, а классы классов называются метаклассами, но это то же отношение, что и с экземплярами.

Наследование - это отношение между классами . Вы можете перейти от класса к его суперклассу, выполнив aClass superclass, и продолжайте делать это, пока не дойдете до класса Object. В Smalltalk указатель суперкласса - это просто переменная экземпляра, определенная во всех классах, а сообщение superclass - это обычный метод доступа.

0 голосов
/ 13 ноября 2015

Как концепция, 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.

...