Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование.PDF
Скачиваний:
208
Добавлен:
01.05.2014
Размер:
3.64 Mб
Скачать

converted to PDF by BoJIoc

Делая класс CueBall подклассом Ball, мы ликвидируем условный оператор в программе изображения шара.

CueBall = Object (Ball) procedure draw; override;

end;

procedure Ball.draw; begin

(* рисуем круг *) PaintOval (region);

end;

procedure CueBall.draw; begin

(* рисуем окружность *) FrameOval (region);

end;

Наибольшее упрощение достигается тем, что теперь можно держать все графические объекты в одном списке. Программа, рисующая весь экран, записывается так:

procedure drawBoard; var

gptr : GraphicalObject; begin

SetPort (theWindow); gptr := listOfObjects;

while gptr <> nil do begin gptr.draw;

gptr := gptr.link; end;

end;

Наиболее важным местом этого кода является вызов функции draw внутри цикла. Несмотря на то что вызов написан один, иногда будет вызываться функция класса Ball, а в других случаях класса Wall или Hole. Тот факт, что одно обращение к функции может привести к вызовам различных функций, относится к понятию полиморфизма. Мы обсудим его в главе 14.

Часть подпрограммы Ball.update, проверяющая, ударился ли движущийся шар обо что- нибудь, также упрощается аналогичным образом. Это можно увидеть в полном исходном тексте в Приложении Б.

Упражнения

1.Предположим, вы хотите производить определенное действие каждый раз, когда программа «Бильярд» выполняет цикл обработки события. В каком месте лучше всего поместить этот код?

2.Предположим, вы хотите сделать шары цветными. Какие части программы вам придется изменить?

3.Предположим, вы хотите добавить лузы на боковых стенках, как на обычном бильярдном столе. Какие части программы вам придется изменить?

4.Программа «Бильярд» использует метод, при котором в цикле просматривается список шаров и каждый шар, имеющий энергию, немного сдвигается. Альтернативный и более объектно-ориентированный подход заключается в том, чтобы позволить каждому шару, пока он имеет энергию, изменять свое состояние и состояние шаров, которые он задевает. Тогда для запуска модели бильярда