Почему метакласс экземпляры метакласса и не класса?

StackOverflow https://stackoverflow.com/questions/4413626

  •  08-10-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Краткий ответ - «Ваше предположение, что классы представляют собой экземпляры широкого класса System, неверно, каждый класс на самом деле является экземпляром классического метакласса», а также «оно не будет работать никаким другим способом».

Небольшая модификация ответа - «Имена действительно путают, иногда проще просто запомнить свои роли и не пытаться слишком много думать о том, как они работают».

Короткий волосатый ответ:

MetAclass - это экземпляр, как и все остальные обычные классы SmallTalk, и это требует собственного выделенного класса. Каждый экземпляр регулярного объекта SmallTalk имеет класс с наследством после иерархии классов. Каждый класс сам по себе является экземпляром металласса класса, с наследством после иерархии метакласс. Каждый метакласс сам по себе является экземпляром класса метакласс, который коротко замыкается виртуальной машиной в аккуратном маленьком трюке, поскольку никто не нашел использование для предоставления родительского класса MetAclass, и все те, кто пытался, в целом, Их здравомыслие начала разрушаться в процессе.

Дольше, еще волосатый ответ:

SmallTalk позволяет каждому классу содержать определенные сообщения класса. Это эквивалентны, примерно, к статическим методам в Java - но с некоторыми значительными различиями. Одним из этих различий является то, что классы SmallTalk на самом деле призваны объектам - они являются живыми объектами в системе, в комплекте с возможностью наследования от других объектов и содержать переменные экземпляра.

Это свойство приводит к потенциальному множеству иерархией наследования в системе. Обычные объекты Каждый - это экземпляры ровно одного класса, с сообщением отправляет объекты поиска класса объектов, а затем после наследства цепочки иерархии классов. Сообщения, отправленные на регулярные объекты, разрешаются по иерархии класса.

Кроме того, объекты класса являются каждые экземпляры одноклассного металласса одного класса. Сообщения, отправленные на объект класса, решаются по поиску на металляр для определенного класса, а затем вверх по иерархии метакласс.

Еще один слой, метакласс-объекты, каждый из которых представляют собой экземпляры широкого уникального метакласса системы. Сообщения, отправленные на объект MetAclass, подняты вверх в системном университете уникальной метаклассе, что не разрешено унаследовать у кого-либо и жестко проводной в виде короткого замыкания в VM.

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

Аккуратный, да?

Другие советы

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

Теперь вы все равно попробуйте использовать класс для обоих объектов. Я думаю, что одна из причин для того, чтобы метакласс - это то, что вам нужно отличить два. Если вы посмотрите на методы theMetaClass а также theNonMetaClass, Вы видите, что они отражают друг друга: вы переходите из MetAclass в класс через THECLASS-член и из класса до метакласса через обычный указатель класса (что любые возможности объекта). Если бы они оба были из класса экземпляра, они не могли знать, какую сторону они реализуют - если не было слота флага, что хуже, чем создание подклассов.

Это одна из тех вещей, которые я идеально понимаю ... пока я не должен объяснить это ;-) После долгих дистилляций ...

Дано:

  • Поведение объекта указывается его классом
  • классы - это объекты тоже
  • Обычные объекты / классы имеют поведение, которое имеет смысл только для регулярных объектов / классов

Поэтому классы и экземпляры должны иметь разные поведения-спецификаторы (то есть классы).

Посмотрел на другой способ, то, что мы называем «стороной экземпляра», представляет сторону экземпляра сорт. Отказ Что мы называем «стороной класса», представляет сторону экземпляра метакласс.

Например, класс определяет #addclassvarnamed: а #addinstvarnamed :, потому что те, кто имеет смысл на стороне экземпляра, где метакласс определяет только #addinstvarnamed :, потому что нет классовых переменных классов класса.

Чтобы добиться глубже в минуту, см. «Pharo на примере» или «Основы техники программирования SmallTalk»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top