Я пытался придумать для этого лучшее название, но не смог. Также каждая тема по этому поводу связана с python, и я не знаю python.
Я знаю, что dafult :meta-class
- это standar-class
И что standard-object
является экземпляром standard-class
, и что каждый класс является экземпляром standard-class
и наследует все от standard-object
, но как это возможно?
Например, как standard-object
может быть объектом и суперклассом одновременно?
Как это работает и почему?
Я не понимаю, как мгновенный класс может быть классом?
поваренная книга lisp, документация по IDE lispworks, cs.cmu.edu/Groups/AI/html/cltl/clm/index.html и google ...
Вы пробовали реализовать простой интерпретатор или систему классов? Если бы вы знали, то самозагрузка так же волшебна, как и рекурсия, и несколько парадоксальна. standard-object
наследует standard-object
Возможный дубликат Иерархия стандартного объекта и стандартного класса в Common Lisp
Нет, позвольте мне перефразировать свой вопрос, как объект может быть классом? Например, как мгновенный класс может быть классом?
Как книга, в которой описывается, как писать книгу, может быть самой книгой? И почему?
Вы, вероятно, найдете ответы в «Искусстве протокола метаобъектов», они показывают, как устроен CLOS, и объясняют проблему начальной загрузки.
Один из способов подумать об этом - забыть, что самозагрузка - это проблема, и представить себе, что объектная система «именно такая», и тогда кажется естественным, что:
standard-object
standard-class
standard-class
- это стандартный класс, который является объектом, который является экземпляром standard-class
, и подклассом standard-object
, который является классом, который является объектом, который является экземпляром standard-class
.Я попытался найти хорошую диаграмму, но не смог.
Другой способ подумать об этом - о начальной загрузке. Как сделать так, чтобы это состояние появилось?
Один из способов - создать объект без существующего класса:
standard-class
в памяти, выделите экземпляр, который станет классом standard-class
.standard-object
(и другими частями иерархии, например, class
, класс T
, generic-function
, method
и т. д.)standard-class
.Вы могли бы задать себе обратный вопрос: почему класс не может быть объектом на объектно-ориентированном языке программирования?
Что такое класс? Это что-то, что содержит информацию о том, как создавать новые объекты, такие как поля, значения по умолчанию и т. д. В ООП инструмент по умолчанию для хранения данных вместе - это объект. Итак, классы CL - это просто объекты! И поскольку классы сами по себе являются объектами, конечно, у них есть класс STANDARD-CLASS
(STANDARD-OBJECT
- это прямой суперкласс класса без каких-либо других суперклассов… см. Структура наследования классов метаобъектов).
В качестве упражнения вы можете попытаться создать свою собственную (очень простую) объектную систему и очень быстро обнаружите, что если ваши классы являются объектами, это облегчит вашу жизнь. Исходя из этого, возникает лишь небольшая проблема с начальной загрузкой. :-)
Я думаю, что приемлемым ответом на «что такое класс» может быть либо «класс существует только во время компиляции и преобразуется в специализированные вызовы функций и vtable», либо «класс - это особая вещь, не относящаяся к среде выполнения, на которую можно ссылаться. только по имени [и может быть рассмотрен ...] »
Вы, безусловно, очень помогли, я также прочитал stackoverflow.com/questions/12815105/…, и он ответил на мой следующий вопрос, но у меня есть вопрос по этому поводу. Стандартный класс - это, по сути, корневое право? Затем у нас есть standard-object
, который сам является экземпляром standard-class
, и после этого у нас есть отдельный объектный класс standard-class
, который является экземпляром стандартного класса и подклассом standard-object
, верно? Мне потребовалось много времени, чтобы осознать это.
Я думаю, это сбивает с толку, но только из-за начальной загрузки и реализации. Ваше описание правильное, но я думаю, что корень - это standard-object
, потому что это суперкласс по умолчанию для любого класса без явных суперклассов. Это означает: создайте standard-object
, затем создайте standard-class
, затем установите класс standard-object
как standard-class
, сделайте то же самое для standard-class
. Когда вы наблюдаете за конечным результатом, это сбивает с толку ...
Какую документацию вы изучили, в чем они не справляются?