<роль-класса>::= (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).