6.3 Основа — Object и Class

Предыдущая  Содержание  Следующая V*D*V

Описания классов с одинаковым набором методов являются объектами метакласса. Метакласс сам по себе это класс и, следовательно, имеет описание класса. Надо полагать, что описания классов для метаклассов снова являются объектами мета (метамета?) классов, которые в свою очередь являются классами и ...

Кажется, неразумно продолжать этот ход мысли. Вместо этого давайте начнём с самых тривиальных объектов, какие только можно себе представить. Определим класс Object с возможностью создавать, уничтожать, сравнивать и отображать объекты.

Интерфейс Object.h:

 

extern const void * Object;     /* new(Object); */

 

void * new (const void * class, ...);

void delete (void * self);

 

int differ (const void * self, const void * b);

int puto (const void * self, FILE * fp);

 

Представление Object.r:

 

struct Object {

    const struct Class * class; /* описание объекта */

};

 

Далее определим представление для описания классов для объектов, то есть структуру, на которую указывает компонент .class в struct Object наших тривиальных объектов. Обе структуры будут необходимы в одних и тех же местах, поэтому добавляем в Object.h:

 

extern const void * Class; /* new(Class, "name", super, size

                                       sel, meth, ... 0); */

 

и в Object.r:

 

struct Class {

    const struct Object _;      /* описание класса */

    const char * name;          /* имя класса */

    const struct Class * super; /* суперкласс класса */

    size_t size;                /* размер объекта класса */

    void * (* ctor) (void * self, va_list * app);

    void * (* dtor) (void * self);

    int (* differ) (const void * self, const void * b);

    int (* puto) (const void * self, FILE * fp);

};

 

struct Class является представлением каждого элемента первого метакласса Class. Этот метаклассом является классом; поэтому его элементы указывают на описание класса. Указание на описание класса является именно тем, что Object может делать, то есть struct Class расширяет struct Object, то есть Class является подклассом Object!

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

 

OOC_Roots_-_Object_and_Class

 

Знак вопроса указывает на одно весьма произвольное решение: имеет Object суперкласс или нет? Это не имеет никакого реального значения, но ради единообразия мы определяем для Object быть своим собственным суперклассом, то есть знак вопроса на картинке заменяется указателем на сам Object.

 

Предыдущая  Содержание  Следующая