
- •ЛР 1. Операторы и выражения Delphi
- •Оператор присваивания
- •Арифметические операторы
- •Оператор конкатенации строк
- •Логические операторы
- •Операторы поразрядного сдвига
- •Операторы отношения
- •Операторы множеств
- •Составной оператор begin..end
- •Условный оператор if..then..else
- •Оператор-селектор case
- •Оператор перехода goto
- •Оператор with..do
- •Организация циклов
- •Цикл с параметром for..do
- •Инструкция in в цикле for..do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Вложенные циклы
- •Операторы break и continue
- •ЗАДАНИЕ
- •Вариант 1.
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 2. Структурные типы
- •Множества
- •Записи
- •Вариантные поля
- •Усовершенствованная запись
- •Массивы
- •Объявление массива
- •Обращение к ячейкам массива
- •Динамический массив
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 3. Объекты и классы
- •Проектирование класса
- •Управление жизненным циклом объекта
- •Опережающее объявление класса
- •Ограничение видимости членов класса
- •Свойства объекта
- •Особенности объявления методов
- •Поля класса и методы класса
- •Иерархия наследования
- •Полиморфизм
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •ЛР4. Опорные классы VCL
- •Класс TObject
- •Класс TPersistent
- •Основа компонента, класс TComponent
- •Владение компонентом
- •Класс TControl
- •Принадлежность к родительскому контейнеру
- •Размещение и размеры элемента управления
- •События, связанные с изменением размеров
- •Выравнивание элемента управления в контейнере
- •Видимость и активность элемента управления
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант5
- •Совет
- •ЛР5. Обработка клавиатурных событий и событий мышки
- •Щелчки кнопками мыши
- •Перемещение указателя мыши
- •Вращение колесика мыши
- •Операция перетаскивания drag and drop
- •Обработка событий клавиатуры
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •ЛР 6. Классы потоков данных
- •Прототип потоков данных, класс TStream
- •Потоки с дескриптором, класс THandleStream
- •Файловый поток данных, класс TFileStream
- •Пример работы с файловым потоком данных
- •Задание
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.

Языки программирования public
property Passenger:byte Read fPassenger Write SetPassenger; end;
procedure TAutobus.SetPassenger(Value: byte); begin
if (Value>=0) and (Value<=30) {ограничение числа пассажиров} then fPassenger:=Value
else Raise Exception.Create('Число пассажиров должно быть от 0 до 30!'); end;
Полиморфизм
Концепция наследования порождает еще одну полезную черту классов — полиморфизм. Идея полиморфизма тесно связана с наследованием и заключается в праве экземпляра некоторого класса представлять все классы из его иерархической цепочки. Более того, благодаря полиморфизму мы получаем право скрывать (инструкция override) или переопределять (инструкция inherited) поведение унаследованных методов. Поэтому различные по содержанию процедуры и функции всевозможных объектов могут использовать одно и то же имя. Вызов же метода будет приводить к выполнению кода соответствующего конкретному экземпляру объекта.
Листинг 3.16 поможет нам разобраться с основными принципами полиморфизма, он представляет собой модуль с цепочкой классов-самолетов.
Листинг 3.16. Цепочка классов TAirframe, TAircraft и TJetAircraft
unit Polymorph;
interface
uses SysUtils, Dialogs;
type
TAirframe = class //абстрактный класс планер procedure Fly; virtual; abstract;
end;
TAircraft = class(TAirframe) |
//самолет |
procedure Fly; override; |
//перезапись метода |
end; |
|
TJetAircraft = class(TAircraft) //реактивный самолет procedure Fly; override; //перезапись метода
end;
implementation
procedure TAircraft.Fly; begin
ShowMessage('Aircraft Fly'); end;
procedure TJetAircraft.Fly; begin
34
СКФУ Кафедра компьютерной безопасности

Языки программирования
{позднее этот участок кода будет доработан}
ShowMessage('JetAircraft Fly'); end;
end.
Первый из классов абстрактный. Это означает, что из него нельзя создать самостоятельный объект, но в этом и нет необходимости, задача планера TAirframe заключается в определении родовой черты всех своих потомков. Это, ни много ни мало, отвечающий за полет метод Fly(), который должен быть обязательно объявлен и заполнен программной логикой у всех наследников
TAirframe — летательных аппаратов, классов TAircraft и TJetAircraft.
Для того чтобы классы TAircraft и TJetAircraft получили право пользоваться одноименным методом Fly(), после объявления его заголовка использована специальная директива override, аннулирующая метод класса-предка.
В результате в момент обращения к процедуре Fly() класса TAircraft выводится окно с текстовым сообщением "Aircraft Fly", процедуре Fly() класса TJetAircraft — "JetAircraft Fly". Одним словом, каждый из самолетов "летает" по-своему. Для того чтобы в этом убедиться, можно воспользоваться листингом 3.17.
Листинг 3.17. Вызов метода Fly() экземпляра класса TJetAircraft
with TJetAircraft.Create do begin
Fly;
Destroy; end;
В ответ на вызов фрагмента кода (листинг 3.17) мы получим сообщение "JetAircraft Fly".
А теперь настал час провести эксперимент с полиморфизмом, но для этого придется внести незначительное исправление в реализацию метода Fly() класса реактивного самолета TJetAircraft. Поэтому мы добавим в программный модуль всего одну строку с инструкцией inherited (листинг 3.18).
Листинг 3.18. Усовершенствование метода Fly() класса TJetAircraft
unit Polymorph;
...
procedure TJetAircraft.Fly; begin
inherited;
ShowMessage('JetAircraft Fly'); end;
end.
Инструкция inherited уведомляет Delphi о том, что при вызове метода Fly() класс TJetAircraft намерен воспользоваться услугами одноименного метода Fly() своего класса-предка TAircraft.
Если вы, после внесения исправлений, вновь вызовите предложенный в листинге 3.17 код, то на экране отобразится не одно, а целых два окна сообщений:
сообщение "Aircraft Fly" (вызванное методом Fly() класса-предка TAircraft);
сообщение "JetAircraft Fly" принадлежащее экземпляру класса TJetAircraft.
35
СКФУ Кафедра компьютерной безопасности