Файл: Лр операторы и выражения Delphi.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 276

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ЛР 1. Операторы и выражения Delphi

Оператор присваивания

Арифметические операторы

Оператор конкатенации строк

Логические операторы

Операторы поразрядного сдвига

Операторы отношения

Операторы множеств

Оператор-селектор case

Оператор перехода goto

Организация циклов

ЛР 2. Структурные типы

Множества

Записи

Массивы

ЛР 3. Объекты и классы

Проектирование класса

Управление жизненным циклом объекта

Опережающее объявление класса

Ограничение видимости членов класса

Свойства объекта

Особенности объявления методов

Поля класса и методы класса

Иерархия наследования

Полиморфизм

ЗАДАНИЕ

ЛР4. Опорные классы VCL

Класс TControl

Принадлежность к родительскому контейнеру

Размещение и размеры элемента управления

Видимость и активность элемента управления

Задание

ЛР5. Обработка клавиатурных событий и событий мышки

Щелчки кнопками мыши

Перемещение указателя мыши

Вращение колесика мыши

Операция перетаскивания drag and drop

Задание

ЛР 6. Классы потоков данных

Прототип потоков данных, класс TStream

свойством Enabled. Еще большую степень защиты мы обеспечили полю

fAutomobile, хранящему ссылку на автомобиль, в который установлен двигатель — свойство допускает только чтение информации из поля.


Особенности объявления методов


Хотя по своей сути метод является процедурой или функцией, в объектно-ориентированном программировании в него вкладывается значительно более глубокий смысл. Концепция ООП предполагает возможность класса наследовать методы своего предшественника, а при необходимости и переопределять их поведение. Для обеспечения этой, очень сложной задачи в Delphi методы разделяются на три категории:

  • статические (директива static);

  • динамические (директива virtual);

  • виртуальные (директива dynamic).

По умолчанию, любой вновь описанный метод, становится статическим. Такое название метод заслужил из-за того, что во время компиляции статическому методу выдается постоянный адрес, такой способ называется статическим связыванием (static binding). У метода с постоянным адресом есть две особенности: высокая скорость вызова (что не может не радовать) и абсолютная невозможность изменить поведение этого метода в дочерних классах (что является отрицательной стороной статического связывания). Одним словом, объявляя статический метод, мы должны понимать, что наносим удар по полиморфизму (наследник класса утратит возможность переопределить этот метод).

В отличие от своего статического собрата виртуальные и динамические методы исповедуют идеи позднего связывания (late binding). Это означает, что адреса таких методов не "высечены в граните", а могут изменяться. Так адреса виртуальных методов класса заносятся в таблицу виртуальных методов этого класса, а адреса динамических методов — в специальный список методов этого класса. Благодаря технологии позднего связывания доступ к виртуальным и динамическим методам осуществляется несколько медленнее, но зато они допускают переопределение своего поведения у классов-потомков.

Поля класса и методы класса


Одно из правил объектно-ориентированного программирования предполагает, что

обращение к полям и методам, описанным в классе, невозможно до тех пор, пока из класса не будет создан объект — экземпляр класса. С точки зрения программы Delphi это означает, что начало работы со свойствами и методами объекта должно предваряться вызовом его конструктора Create().

Однако из правил существуют исключения. В состав класса могут входить особые поля и методы, которые остаются доступными даже в отсутствие экземпляра объекта. Такие поля и методы называют соответственно полями класса (class fields) и методами класса (class methods).

По своей сути поле класса представляет собой обычную переменную, для ее объявления следует воспользоваться ключевыми словами class var или просто var.

Метод класса представляет собой процедуру или функцию с первым словом в заголовке class, например class procedure или class function.

Благодаря полю класса и методу класса мы можем внести очередное усовершенствование класса двигателя TEngine (листинг 3.13).


Листинг 3.13. Объявление поля класса и метода класса TEngine




TEngine=class private

fEnabled :boolean; fAutomobile:TAutomobile;

public

class var fMax_HorsePower : word; //переменная класса

class function GetMax_HorsePower : word; //метод класса

...

end;

{реализация функции класса}

class function TEngine.GetMax_HorsePower: word;

begin

Result:=fMax_HorsePower;

end;
Как и утверждалось ранее, для обращения к полям и методам класса совсем не обязательно создавать объект, вполне допустимо воспользоваться строками кода из листинга 3.14.


Листинг 3.14. Обращение к полю класса и методу класса TEngine




var X:Word;

begin

with TEngine do
begin

fMax_HorsePower:=250; X:=GetMax_HorsePower;

end; end;


Иерархия наследования


Вновь возвратимся к очень важному ингредиенту ООП — наследованию. Мы уже знаем, что в основе концепции наследования лежит возможность строительства нового класса на базе уже существующего родительского класса. Благодаря наследованию дочерний класс впитывает в себя все родовые черты своего предка. Ограничений на длину цепочки наследования нет, в визуальной библиотеке компонентов Delphi объявлены классы, имеющие в родословной больше десятка предков. Таким образом, самый последний в древе наследования класс вбирает в себя все лучшее от всех своих предшественников.

Для того чтобы понять какие уникальные возможности предоставляет программисту наследование, перейдем к практической стороне вопроса. В нашем распоряжении уже имеется класс TAutomobile, олицетворяющий все наши знания в области ООП. Попробуем развить первоначальный успех и создать программный класс, способный смоделировать пассажирский автобус — класс TAutobus.

Автобус — это всего лишь разновидность автомобиля. У него, как и у автомобиля, есть двигатель, автобус также может набирать и снижать скорость движения. Одним словом, за основу нашего нового класса можно взять уже существующий TAutomobile и дополнить его всего одной возможностью — перевозить пассажиров (листинг 3.15).


Листинг 3.15. Создание дочернего класса TAutobus




type TAutobus=class(TAutomobile)

private

fPassenger:byte; //поле число пассажиров

procedure SetPassenger(Value:byte); //управление числом пассажиров

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('Число