[ Атас! ]
_________________
248 стр. Часть 4. Наследование
Глава 22. РАЗЛОЖЕНИЕ КЛАССОВ ...249
ОГЛАВЛЕНИЕ
В этой главе...
►Разложение 249
►Реализация абстрактных классов 253
►Разделение исходного кода С++ 259
Концепция наследования помогает в достижении многих целей; например, благодаря ему я плачу за обучение моего сына. Оно помогает избежать повторения кода и сократить время, затрачиваемое на написание программ. Благодаря наследованию можно повторно использовать уже существующий код в новых программах, переопределяя функции.
Главное преимущество наследования — возможность указывать тип взаимосвязи между классами. Это так называемая взаимосвязь типа ЯВЛЯЕТСЯ: микроволновая печь ЯВЛЯЕТСЯпечью и т.д.
Разложение — это прекрасный способ создания правильных связей. К примеру, связь микроволновой печи с конвекционной печью кажется естественной. Утверждение же о том, что микроволновая печь является особым типом тостера, скорее всего, вас несколько насторожит. Конечно, оба эти прибора нагревают, оба используют электричество и оба находятся на кухне, но на этом сходство заканчивается — микроволновая печь не готовит тосты.
Процедура определения классов, свойственных данной проблеме, и задания корректных связей между этими классами известна под названием разложение ( factoring) ( это слово относится к арифметике, с которой вы мучились в средней школе; помните, как вы занимались разложением числа на простые множители: 12 равно 2, умноженное на 2 и на 3... ).
Чтобы увидеть, как использовать наследование для упрощения ваших программ, рассмотрим простейшее банковское приложение.

«Предположим, что нам надо написать простейшую банковскую программу. ( Описание этой программы имеется на прилагаемом компакт-диске. )»
[ Диск ]
Я мог бы до посинения рассказывать об этих классах, однако, к счастью, объектно-ориентированные программисты придумали довольно наглядный и краткий путь описания классов. Классы Checking и Savings показаны на рис. 22.1.
Для того чтобы правильно понять этот рисунок, необходимо знать несколько правил.
■■■
■ Большой прямоугольник — это класс. Имя класса написано сверху.
■ Имена в меньших прямоугольниках — это функции-члены.
_________________
249 стр. Глава 22. Разложение классов

Рис. 22.1. Независимые классы Checking и Savings
■ Имена не в прямоугольниках — это данные-члены.
■ Имена, которые выступают за пределы прямоугольника, ограничивающего класс, являются открытыми; к этим членам могут обращаться функции, не являющиеся членами класса или его наследников. Члены, которые находятся полностью внутри прямоугольника, недоступны снаружи класса.
■ Толстая стрелка обозначает связь типа ЯВЛЯЕТСЯ.
■ Тонкая стрелка обозначает связь типа СОДЕРЖИТ.
■■■
Автомобиль ЯВЛЯЕТСЯтранспортным средством и при этом СОДЕРЖИТмотор.
На рис. 22.1 вы можете увидеть, что классы Checking и Savings имеют много общего. Например, оба класса включают функции-члены withdrawal( ) и deposit( ) . Поскольку эти классы не идентичны, они, конечно же, должны оставаться раздельными ( в реальном банковском приложении эти два класса отличались бы гораздо существеннее ). Однако мы должны найти способ избежать дублирования.
Можно сделать так, чтобы один из этих классов наследовал другой. Класс Savings имеет больше членов, чем Checking , так что мы могли бы унаследовать Savings от Checking . Такой путь реализации этих классов приведён на рис. 22.2. Класс Savings наследует все члены класса Checking . Кроме того, в классе добавлен член noWithdrawal и переопределена функция withdrawal( ) . Эта функция переопределена, поскольку правила снятия денег со сберегательного счёта отличаются от правил снятия с чекового счёта ( хотя меня эти правила вообще не касаются, поскольку у меня нет денег, которые можно было бы снять со счёта ).
Хотя наследование Savings от Checking и сберегает наш труд, нас оно не очень удовлетворяет. Главная проблема состоит в том, что оно искажает истинное положение вещей. При таком использовании наследования подразумевается, что счёт Savings является специальным случаем счёта Checking .
Читать дальше