Правила программирования на Си и Си++



         

101. Си++ — это не Smalltalk: избегайте общего класса object - часть 2


Лучшим способом избежать этой проблемы является использование множественного наследования для реализации классов-смешений. Вот как смешение работает. Возвратившись к нашему примеру с employee, вы могли бы реализовать его в виде системы классов следующим образом:

class employee

{

// содержит всю информацию, общую для всех служащих:

// фамилия, адрес и т.д.

};

class manager : public employee

{

// добавляет информацию, специфичную для управляющего,

// такую, как

список подчиненных служащих. Управляющий тоже

// является служащим, поэтому применимо наследование

   database list_of_managed_emploees;

}

class peon : public employee

{

// добавляет информацию, специфичную для поденщика

   manager *this_boss;

}

Все это приемлемо до тех пор, пока не приходит время создавать наш список объектов employee, который поддерживается объектом manager. Во многих реализациях структур данных объект делается сохраняемым путем наследования его класса от класса, который реализует то, что нужно структуре данных для работы по назначению. Вы могли бы сделать это здесь так:

class storable;                  // сохраняемый

class employee : public storable { /* ... */ };

class manager  : public employee { /* ... */ };

class peon     : public employee { /* ... */ };

Например, метод add()

класса database мог бы получать указатель на объект storable в качестве своего аргумента. Таким способом любой объект storable

(или объект, производный от storable) может быть добавлен в database без необходимости модифицировать что-либо в программе, в состав которой входит класс database.

Все кажется правильным до тех пор, пока мы реально не взглянем на то, как используются классы. Давайте скажем, что это средняя фирма, где число управляющих относится к числу поденщиков как 100 к 1. Однако списка управляющих нет, есть лишь список поденщиков. Тем не менее, каждый manager

обладает

излишней сохраняемостью, которая никогда не используется. Решим эту проблему при помощи множественного наследования.




Содержание  Назад  Вперед