C.3 Корневые классы |
Предыдущая Содержание Следующая |
Введение — предисловие к корневым классамObject Class Exception
Object(3) — корневой класс; Object(3) — корневой метакласс. Большинство методов, определённых для Object, используется в стандартных отчётах для ooc(1), то есть они не могут быть изменены без изменения отчётов. Exception(3) управляет стеком обработчиков исключений. Этот класс не обязателен для работы с ooc.
Класс Class: Object — корневой метаклассObject Class
new(Class(), name, superclass, size, selector, tag, method, ... , 0);
Object @ allocate (const self) const Class @ super (const self) const char * nameOf (const self)
Объект метакласса описывает класс, то есть он содержит имя класса name, указатель на описание суперкласса класса super, размер объекта size в классе и информацию обо всех динамически компонуемых методах, которые могут быть применены к объектам класса. Эта информация состоит из указателя на селекторную функцию selector, строки тэга tag для метода respondsTo (который может быть пустым) и указателя на саму функцию метода method для объектов этого класса. Метакласс это набор объектов метакласса, которые содержат таким образом всё множество информации о методе, где, конечно же, каждый объект метакласса может указывать на различные методы. Описание метакласса описывает метакласс. Class — корневой метакласс. Есть метакласс объекта Class, который описывает метакласс Class. Любой другой метакласс X описывается некоторым другим объектом метакласса X, который является членом Class. Метакласс Class содержит объект метакласса Object, который описывает корневой класс Object. Новый класс Y, у которого есть те же динамически компонуемые методы, как класса Object, описывается объектом метакласса Y, который является членом Class. Новый класс Z, у которого больше динамически компонуемых методов, чем у Object, требует метакласс объекта Z, который является членом нового метакласса M. Этот новый метакласс имеет описание метакласса M, которое является членом Class. Конструктор Class используется, чтобы создать новые объекты описания классов, подобных Y, и объекты описания метаклассов, такие как M. Конструктор M используется, чтобы создать новые объекты описания классов, подобных Z. Конструктор Y создаёт объекты, которые являются членами класса Y, а конструктор Z создаёт объекты в классе Z. allocate резервирует память для объекта своего аргумента класса и устанавливает этот класс как указатель описания класса. Если не перезаписан, new вызывает allocate и применяет к результату ctor. retrieve вызывает allocate и применяет к результату geto. super возвращает суперкласс из описания класса. nameOf возвращает имя из описания класса. Конструктор ctor у Class обрабатывает наследование метода. В new должна быть передана информация только о перезаписываемых методах. Эта информация состоит из адреса селектора для определения местоположения метода, строки тэга, которая может быть пустой, и адреса нового метода. Наборы информации о методе могут переданы в любом порядке; ноль вместо селектора selector завершает список. delete, dtor и geto не выполняют никаких операций для описаний классов. Доступ к описаниям класса получают только посредством функций, которые инициализируют описание во время первого вызова. СМОТРИ ТАКЖЕ ooc(1), retrieve(2) Класс Exception: Object — управление стеком обработчиков исключенийObject Exception
new(Exception());
int catch (self) void cause (int number)
Exception — класс для управления стеком обработчиков исключений. Новейший объект Exception может получить ненулевой номер исключения после снаряжения с помощью catch, отправленный с помощью cause(). ctor вталкивает новый объект Exception в глобальный стек исключений, dtor удаляет его. Эти вызовы должны быть сбалансированы. catch снаряжает такой объект для получения номера исключения. Как только номер отправлен, catch возвратит его. Эта функция реализована как макрос с помощью setjmp(3) и подвластна тем же ограничениям; в частности, функция, содержащая вызов catch, должна быть всё ещё активной в момент отправки номера исключения. Другие методы обычно не должны применяться к объекту Exception. СМОТРИ ТАКЖЕ setjmp(3) Класс Object — корневой классObject Class
new(Object());
typedef void (* Method) ();
const void * classOf (const self) size_t sizeOf (const self) int isA (const self, const Class @ class) int isOf (const self, const Class @ class) void * cast (const Class @ class, const self) Method respondsTo (const self, const char * tag) %- void * ctor (self, va_list * app) void delete (self) void * dtor (self) int puto (const self, FILE * fp) void * geto (self, FILE * fp) void forward (self, void * result, Method selector, const char * name, ...) %+ Object @ new (const self, ...)
Object — корневой класс; Object является самым первым суперклассом всех классов и метаклассов. Class является предпоследним суперклассом метаклассов. classOf возвращает описание класса объекта; sizeOf возвращает его размер в байтах. isA возвращает истину, если объект описан указанным описанием класса, то есть если он принадлежит этому классу. isA возвращает ложь для нулевых указателей. isOf возвращает истину, если объект принадлежит указанному классу или имеет его как суперкласс. isOf возвращает ложь для нулевых указателей и истину для любых объектов и класса Object. cast проверяет, описан ли его второй параметр непосредственно или в конечном счёте, ранее. Если нет, и в частности для нулевых указателей, вызывающая программа завершается. cast обычно возвращает свой второй аргумент неизменённым; для эффективности cast может быть заменён макросом. respondsTo возвращает ноль или соответствующий тэгу селекторный метод для некоторого объекта. Если результат не ноль, этот объект, как подходящий, вместе с другими аргументами может быть передан этому селектору. ctor — конструктор. Он получает дополнительные аргументы от new. Он должен сначала вызвать super_ctor, который может израсходовать часть списка аргументов, а затем выполнить свою собственную инициализацию с использованием остальной части списка аргументов. delete, если не перезаписан, уничтожает объект, вызывая dtor и отправляя результат в free(3). Нулевые указатели не могут быть переданы в delete. dtor ответственен за возврат ресурсов, полученных объектом. Он обычно будет вызывать super_dtor и позволять ему определить свой результат. Если будет возвращён нулевой указатель, delete не будет освобождать память этого объекта. puto записывает ASCII представление объекта в поток. Обычно он будет вызывать puto суперкласса, чтобы вывод начинался с имени класса. Представление должно быть разработано так, чтобы geto мог получить из потока всё, кроме имени класса, и поместить эту информацию в область, переданную в виде первого параметра. Работа geto очень похожа на ctor и обычно будет позволять geto суперкласса обрабатывают часть, записанную суперклассом puto. forward вызывается селектором, если он не может быть применён к объекту. Данный метод может быть перезаписан, чтобы передавать сообщения. new, если не перезаписан, вызывает allocate и передаёт его результат в ctor вместе с оставшимися аргументами. СМОТРИ ТАКЖЕ ooc(1), retrieve(2), Class(3)
|
Предыдущая Содержание Следующая |