ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 297
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ЛР 1. Операторы и выражения Delphi
Управление жизненным циклом объекта
Ограничение видимости членов класса
Особенности объявления методов
Принадлежность к родительскому контейнеру
Размещение и размеры элемента управления
Видимость и активность элемента управления
ЛР5. Обработка клавиатурных событий и событий мышки
пассажиров должно быть от 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
{позднее этот участок кода будет доработан} 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 код, то на экране отобразится не одно, а целых два окна сообщений:
Создайте указанную в варианте цепочку классов. Оформите разработанные классы в отдельном файле .pas. Разработайте приложение демонстрирующее работоспособность классов.
Разработайте цепочку классов:
Шлюпка—Корабль—Подводнаялодка
Характеристики шлюпки: скорость движения, угол поворота руля (0..359 градусов).
Характеристики корабля: характеристики шлюпки + двигатель (вкл/откл). Корабль не может двигаться с включённым двигателем.
Характеристики подводной лодки: характеристики корабля + глубина погружения (до 300 метров) + люк ложки (открыт/закрыт). Лодка не может погружаться с открытым люком, люк не может быть открыт на глубине.
Разработайте цепочку классов:
Воздушныйшар—Дирижабль— Самолёт
Характеристики воздушного шара: скорость движения, направление движения (0..359 градусов), высота подъёма (до 3000 метров).
Характеристики дирижабля: характеристики воздушного шара + двигатель (вкл/откл). Дирижабль не может двигаться с отключенным двигателем.
Характеристики самолёта: характеристики дирижабля + высота полёта (до 15000 метров) + люк ложки (открыт/закрыт). Самолёт не может “остановиться” в полёте.
Разработайте цепочку классов:
Свеча—Электролампочка—Прожектор
Характеристики свечи: зажжена/потушена.
Характеристики лампочки: характеристики свечи + исправна/неисправна, мощность (25..100 Вт), цвет свечения. Лампа не может светиться в выключенном и в неисправном
состоянии.
Характеристики прожектора: характеристики лампочки + только белый цвет + мощность (0,5..50 кВт)+ азимут и угол места направления света.
Разработайте цепочку классов:
Плёночныйфотоаппарат—Цифровойфотоаппарат—Цифроваявидеокамера
Характеристики плёночного фотоаппарата: фотоплёнка установлена/отсутствует, число оставшихся кадров (от 0 до 36), метод — сделать снимок (уменьшает число оставшихся кадров).
Характеристики цифрового фотоаппарата: качество снимка (плохое/хорошее/отличное — соответственно размер файла 0,5/1/2Мб), общий размер флэш-памяти (16/32/64 Гб), остаток свободного места флэш-памяти (уменьшается после каждого снимка).
Характеристики цифровой видеокамеры: характеристики цифрового фотоаппарата + режим работы (фотоаппарат/видеокамера), качество видео (плохое/хорошее/отличное соответственно 1
минута видеофайла занимает 10/50/100 Мб), общий размер памяти (128/256/512 Гб), остаток свободного места.
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
{позднее этот участок кода будет доработан} 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.
ЗАДАНИЕ
Создайте указанную в варианте цепочку классов. Оформите разработанные классы в отдельном файле .pas. Разработайте приложение демонстрирующее работоспособность классов.
Вариант 1
Разработайте цепочку классов:
Шлюпка—Корабль—Подводнаялодка
Характеристики шлюпки: скорость движения, угол поворота руля (0..359 градусов).
Характеристики корабля: характеристики шлюпки + двигатель (вкл/откл). Корабль не может двигаться с включённым двигателем.
Характеристики подводной лодки: характеристики корабля + глубина погружения (до 300 метров) + люк ложки (открыт/закрыт). Лодка не может погружаться с открытым люком, люк не может быть открыт на глубине.
Вариант 2
Разработайте цепочку классов:
Воздушныйшар—Дирижабль— Самолёт
Характеристики воздушного шара: скорость движения, направление движения (0..359 градусов), высота подъёма (до 3000 метров).
Характеристики дирижабля: характеристики воздушного шара + двигатель (вкл/откл). Дирижабль не может двигаться с отключенным двигателем.
Характеристики самолёта: характеристики дирижабля + высота полёта (до 15000 метров) + люк ложки (открыт/закрыт). Самолёт не может “остановиться” в полёте.
Вариант 3
Разработайте цепочку классов:
Свеча—Электролампочка—Прожектор
Характеристики свечи: зажжена/потушена.
Характеристики лампочки: характеристики свечи + исправна/неисправна, мощность (25..100 Вт), цвет свечения. Лампа не может светиться в выключенном и в неисправном
состоянии.
Характеристики прожектора: характеристики лампочки + только белый цвет + мощность (0,5..50 кВт)+ азимут и угол места направления света.
Вариант 4
Разработайте цепочку классов:
Плёночныйфотоаппарат—Цифровойфотоаппарат—Цифроваявидеокамера
Характеристики плёночного фотоаппарата: фотоплёнка установлена/отсутствует, число оставшихся кадров (от 0 до 36), метод — сделать снимок (уменьшает число оставшихся кадров).
Характеристики цифрового фотоаппарата: качество снимка (плохое/хорошее/отличное — соответственно размер файла 0,5/1/2Мб), общий размер флэш-памяти (16/32/64 Гб), остаток свободного места флэш-памяти (уменьшается после каждого снимка).
Характеристики цифровой видеокамеры: характеристики цифрового фотоаппарата + режим работы (фотоаппарат/видеокамера), качество видео (плохое/хорошее/отличное соответственно 1
минута видеофайла занимает 10/50/100 Мб), общий размер памяти (128/256/512 Гб), остаток свободного места.