Множественное наследование

Если один класс наследуется от другого класса, первый класс называется подклассом класса, а второй класс — суперклассом первого. Каждый определенный пользователем класс должен иметь хотя бы один прямой супер­класс, т. е. по крайней мере один класс должен появиться в части is-a конструктора defclass.

Множественное наследование происходит, когда класс имеет более одного суперкласса. В этом случае COOL проверяет список прямых суперклассов для нового класса и устанавливает некоторый линейный порядок, называе­мый списком предшествования классов. Новый класс наследует слоты и об­работчики сообщений каждого класса в списке предшествования классов.

Слоты и обработчики сообщений класса, стоящего в начале списка предше­ствования, переопределяют конфликтующие определения из других классов, ранее найденных в списке предшествования. Класс, стоящий перед другим классом в списке предшествования, называется более определенным. Все списки предшествования классов оканчиваются системным классом object, и большинство (если не все) списков предшествования классов для опреде­ленных пользователем классов заканчиваются парой системных классов — user и object. Вывести на экран список предшествования можно с по­мощью функции describe-class (см. гл. 15).

Для определения списка предшествования классов нового класса COOL ис­пользует иерархию наследования от непосредственного суперкласса. COOL рекурсивно применяет следующие два правила к непосредственным супер­классам класса, список предшествования которого необходимо определить:

1. Класс имеет более высокий приоритет, чем любой из его суперклассов.

2. Определение класса задает приоритет между его непосредственными суперклассами.

В случае если, воспользовавшись приведенными выше правилами, можно построить более одного списка предшествования, то COOL построит наи­более простой список, получаемый с помощью обхода дерева наследования класса в глубину. Эта эвристика максимально долго сохраняет родственное дерево класса. Например, если ребенок наследует основные черты от матери и отца, а мать и отец в свою очередь наследуют черты от своих родителей, список предшествования классов для ребенка будет следующим: ребенок, мать, мать матери, отец матери, отец, мать отца, отец отца. Возможны и другие варианты создания списка предшествования, удовлетворяющие пра­вилам, например: ребенок, мать, отец, отец отца, мать матери, мать отца, отец матери. Однако COOL воспользуется первым вариантом, т. к. он со­храняет фамильное дерево класса настолько долго, насколько это возможно.

Приведем несколько примеров, иллюстрирующих построение списка пред­шествования класса.