Часть подпрограммы Ball.update, проверяющая, ударился ли движущийся шар обо что-
нибудь, также упрощается аналогичным образом. Это можно увидеть в полном исходном
тексте в Приложении Б.
Упражнения
1. Предположим, вы хотите производить определенное действие каждый раз, когда
программа «Бильярд» выполняет цикл обработки события. В каком месте лучше
всего поместить этот код?
2. Предположим, вы хотите сделать шары цветными. Какие части программы вам
придется изменить?
3. Предположим, вы хотите добавить лузы на боковых стенках, как на обычном
бильярдном столе. Какие части программы вам придется изменить?
4. Программа «Бильярд» использует метод, при котором в цикле просматривается
список шаров и каждый шар, имеющий энергию, немного сдвигается.
Альтернативный и более объектно-ориентированный подход заключается в том,
чтобы позволить каждому шару, пока он имеет энергию, изменять свое состояние и
состояние шаров, которые он задевает. Тогда для запуска модели бильярда
необходимо только придать движение белому шару. Измените программу, чтобы
использовать этот подход. Что дает более реальную модель? Почему?
Глава 7: Наследование
Первым шагом при изучении объектно-ориентированного программирования было
осознание задачи как взаимодействия программных компонент. Этот организационный
подход был главным при разборе примеров в главах 5 и 6.
Следующим шагом в изучении объектно-ориентированного программирования станет
организация классов в виде иерархической структуры, основанной на принципе
наследования. Под наследованием мы понимаем возможность доступа представителей
дочернего класса (подкласса) к данным и методам родительского класса (надкласса).
7.1. Интуитивное описание наследования
Давайте вернемся к Фло — хозяйке цветочного магазина из первой главы. Мы вправе
ожидать от нее вполне определенного поведения не потому, что она хозяйка именно
цветочного магазина, а потому, что она хозяйка магазина. Например, Фло попросит вас
оплатить заказ, а затем даст вам квитанцию. Эти действия не являются уникальными для
владельца цветочного магазина; они общие для булочников, бакалейщиков, продавцов
канцелярских товаров и автомобилей и т. д. Таким образом, мы как бы связали
определенное поведение с общей категорией «хозяева магазинов» Shopkeeper, и
поскольку хозяева (и хозяйки) цветочных магазинов (Florist) являются частным случаем
категории Shopkeeper, поведение для данного подкласса определяется автоматически.
В языках программирования наследование означает, что поведение и данные, связанные с
дочерним классом, всегда являются расширением (то есть большим множеством) свойств,
связанных с родительскими классами. Подкласс имеет все свойства родительского класса
и, кроме того, дополнительные свойства. С другой стороны, поскольку дочерний класс
является более специализированной (или ограниченной) формой родительского класса, он
также, в определенном смысле, будет сужением родительского класса. Это
диалектическое противоречие между наследованием как расширением и наследованием
как сужением является источником большой силы, присущей данной технике, и в то же
PDF created with pdfFactory Pro trial version www.pdffactory.com