Что означает «классы не объекты»? - PullRequest
7 голосов
/ 26 мая 2020

Из книги GoF:

Prototype особенно полезен со статическими c языками, такими как C ++, где классы не являются объектами, и во время выполнения доступна небольшая информация о типах или ее нет. Это менее важно в таких языках, как Smalltalk или Objective C, которые предоставляют то, что составляет прототип (то есть объект класса) для создания экземпляров каждого класса. Этот шаблон встроен в языки, основанные на прототипах, такие как Self [US87], в которых все создание объектов происходит путем клонирования прототипа.

Что означает «классы не являются объектами»?

Разве это не всегда так?

Что значит для класса быть объектом?

Ответы [ 2 ]

8 голосов
/ 26 мая 2020

В некоторых языках, когда вы объявляете класс, языковая среда выполнения создает объект в памяти для представления этого класса и его свойств; затем вы можете вызывать методы этого объекта-класса, чтобы узнать свойства класса или создать объекты этого класса и т. д. накладные расходы); нет объекта, представляющего класс. (Наиболее близким к этому является объект RTTI type_info , но на самом деле это просто объект, содержащий некоторую информацию о классе, а не полное представление самого класса)

2 голосов
/ 26 мая 2020

Что означает «классы не являются объектами»?

В точности как это звучит. В некоторых языках сами классы также являются объектами , которым вы можете отправлять сообщения. Например, чтобы создать экземпляр класса (т.е. новый объект), вы отправляете классу сообщение +alloc (а затем обычно отправляете полученному объекту сообщение -init:

Foo *newFoo = [[Foo alloc] init];

Разве это не всегда так?

Нет. См. Выше. См. Также Является ли класс объектом объектно-ориентированного языка и Являются ли классы объектами в Objective- C? . Примеры помимо Objective- C включают Smalltalk, Scheme и Dylan.

Что означает для класса быть объектом?

Это означает, что вы можете работать с классом так же, как и с любым другим объектом. Детали зависят от языка. В Objective- C, класс является объектом, потому что он является экземпляром метакласса Class. Objective- C делает различие между методами экземпляра , то есть сообщениями, которые могут быть отправлены экземпляру класса, и методы класса , т.е. сообщения, которые могут быть отправлены классу сам. Например, очень часто имеется общий экземпляр класса и метод класса, который получает этот общий объект:

NSFileManager *fileManager = [NSFileManager defaultManager];

Обратите внимание, что мы на самом деле не выделяем здесь объект, а просто запрашиваем у класса общий экземпляр (которым управляет класс), который может существовать или не существовать (если нет, класс обычно создает его).

...