Определение 11.2. Синтаксис спецификатора роли класса
<роль-класса>::= (role concrete │ abstract) Абстрактные классы предназначаются только для наследования. Нельзя создать экземпляры объектов абстрактного класса. Конкретные классы могут быть использованы как для наследования, так и для создания экземпляров объектов этих классов. Если с помощью спецификатора роли был создан абстрактный класс, а потом данный класс был использован в функции make-instance для создания экземпляра объекта этого класса, COOL сгенерирует соответствующую ошибку. Если спецификатор роли класса не был задан, роль класса определяется наследованием. В этом случае роль нового класса принимает значение роли первого непосредственного суперкласса из списка наследования (пример 11.11). Пример 11.11. Наследование спецификатора роли класса (defclass A (is-a USER) (role concrete)) (defclass В (is-a USER)) (defclass С (is-a A B)) (defclass D (.is-a В А)) Класс а является конкретным, поскольку это явно задано спецификатором роли. Класс B — абстрактным, т. к. его первый суперкласс user абстрактный. Класс C будет конкретным классом, потому что первый его суперкласс (а) является конкретным классом, а класс D, напротив, станет абстрактным классом, поскольку абстрактным классом является класс В, его первый суперкласс в списке наследования. Активные и неактивные классы С помощью спецификатора активности класса можно задать поведение объекта данного класса при проведении сопоставления образцов. Класс может быть либо активным, либо неактивным. Определение 11.3. Синтаксис спецификатора активности класса <активность-класса>::= (pattern-match reactive │ non-reactive) Объекты активного класса могут применяться при сопоставлении образцов во время выполнения правил. Объекты неактивного класса не могут использоваться при сопоставлении образцов и не принимают участие в определении списков классов, применимых для сопоставления образцов. Абстрактный класс не может быть активным. Если спецификатор роли класса не был задан явно, активность класса определяется наследованием. В этом случае активность нового класса принимает значение активности первого непосредственного суперкласса из списка наследования (пример 11.12). Пример 11.12. Наследование спецификатора активности класса (defclass A (is-a USER) (role concrete) (pattern-match reactive)) (defclass В (is-a USER) (role concrete)) (defclass С (is-a A B)) (defclass D (is-a В А)) Класс а является активным, т. к. это явно задано спецификатором активности класса. Класс В — неактивным, поскольку он наследуется от абстрактного, а значит, и неактивного класса user. Класс С будет активным классом, потому что первый его суперкласс (а) активен. Класс D, напротив, будет неактивным, т. к. первый суперкласс в его списке наследования (В) неактивен. Слоты класса Слот — это место для хранения значений, ассоциированных с объектом определенного пользователем класса. Каждый экземпляр объекта имеет свою копию набора слотов, определенных в его классе непосредственно, а также копию любых слотов, полученных наследованием. Количество слотов ограничивается только доступной памятью вашего компьютера. Именем слота может быть любое значение типа symbol за исключением ключевых слов is-а и name, которые зарезервированы для использования в образцах объекта. Для определения набора слотов объекта список предшествования классов рассматривается в порядке от более определенных к более общим классам (слева направо). Класс является более определенным, чем любой его суперкласс. Слоты, определенные в любом классе в списке предшествования классов, помещаются в экземпляр объекта за исключением не наследуемых слотов (см. подразд. "Грань распространения при наследовании" данного раздела). Если слот наследуется более чем от одного класса, то используется определение, данное ему в наиболее определенном классе, за исключением композитных слотов (см. подразд. "Грань источника" этого раздела). Рассмотрим пример 11.13.
|