Затем проектируйте иерархию снизу вверх
После того, как вы спроектировали систему объектов и сообщений, вы можете приступать к иерархии. Откиньтесь на спинку кресла и взгляните на различные объекты, и вы увидите, что многие из них получают похожие сообщения. Если два сообщения, посылаемые к разным объектам, похожи, но не одинаковы, то вам может подойти слегка более общее компромиссное, которое сможет работать и в том, и в другом месте. Обработчики для всех общих сообщений должны быть сконцентрированы в единый базовый класс. Например, имея один объект, получающий сообщения A, B и C, и второй объект, получающий A, B, D и E, вы должны остановиться на маленькой иерархии классов, в которой базовый класс реализует обработчики сообщений для A и B, один производный класс реализует обработчик для C, а второй производный класс — обработчики для D и E. Вы продолжаете этот процесс соединения общих элементов в общие базовые классы до тех пор, пока нечего будет соединять. Теперь у вас есть иерархия базовых классов.
Вы заметите, что, чем более общим является класс, тем выше он расположен в иерархии. Например, класс управляющего manager вероятно имеет все свойства класса обобщенного служащего employee, а также несколько дополнительных свойств (таких, как список подчиненных служащих). Тогда для manager
имеет смысл наследовать от employee,
потому что это добавит возможности, отсутствующие в базовом классе employee.
На этом этапе процесса проектирования вы все еще даже не подумали о том, что же должно быть внутри объектов. Вы по-прежнему имеете дело только с системой обмена сообщениями.
Последним шагом на этом этапе проектирования — после того, как вы сделали эскиз проекта иерархии классов — остается запись определений классов. Вы добавите открытые (public) функции-члены для каждого сообщения, получаемого объектом. Эти обработчики сообщений являются единственными открытыми членами вашего определения класса. Все остальное должно быть закрытым или защищенным. Подробнее об этом далее.