- •Глава 1
- •Структура модуля
- •Интерфейс
- •Реализация
- •Инициализация и завершение
- •Ключевые слова
- •Ключевое слово const
- •Ключевое слово type
- •Комментарии
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Константы
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Операции со строками
- •Разбиение литерала по строкам программы
- •Строковые функции
- •Множества
- •Совместимость типов данных
- •Примечание.
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Глава 2.
- •Вложенные условия. Операторы if могут быть вложены друг в друга произвольное число раз:
- •Элементы структуры цикла
- •Цикл for…
- •Цикл for с увеличением счетчика синтаксически определен как
- •Цикл for с уменьшением счетчика в общем случае имеет следующий вид
- •Функции Pred и Succ
- •Цикл while
- •Синтаксис цикла while имеет вид
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Пример записи
- •Оператор with
- •Массивы записей
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Глава 3
- •Анатомия класса
- •Наследование
- •Ключевые слова is и as
- •Что такое класс?
- •Анатомия класса
- •Указатель Self
- •Пример класса
- •Анализ объявления и реализации
- •Наследование
- •Перекрытие методов
- •Ключевые слова is и as
Пример класса
Ниже приведен текст модуля, содержащий описание класса TAirplane. Класс TAirplane инкапсулирует задачу управления неким самолетом. Объекты этого класса можно было бы использовать в программе–симуляторе управления движением самолетов различного типа. Управление осуществляется посылкой «пилоту» той или иной команды из числа заранее оговоренных. В данном случае это команды «взлетайте», «садитесь», «измените (курс, высоту, скорость полета)».
Сперва изучите объявление класса и описания его методов. Затем мы обсудим детали.
unit AirplanU;
interface
uses
SysUtils;
const
{ Категории самолетов }
Airliner = 0; // трансконтинентальный авиалайнер
Commuter = 1; // для местных авиалиний
PrivateCraft = 2; // частный самолет
{ Константы состояния }
TakingOff = 0; // Взлетает
Cruising = 1; // В полете
Landing = 2; // Приземляется
OnRamp = 3; // На стоянке
{ Константы типов сообщений }
MsgChange = 0; // Изменить
MsgTakeOff = 1; // Взлететь
MsgLand = 2; // Приземлиться
MsgReport = 3; // Отрапортовать
type
TAirplane = class
private
Name : string; // Идентификатор самолета
Speed : Integer; // Скорость
Altitude : Integer; // Высота
Heading : Integer; // Курс
Status : Integer; // Состояние
Kind : Integer; // Тип
Ceiling : Integer; // Потолок
protected
procedure TakeOff(Dir : Integer); virtual;
procedure Land; virtual;
public
constructor Create(AName:string;AKind:Integer = Airliner);
function SendMessage(Msg:Integer; var Response : string;
Spd : Integer; Dir : Integer; Alt : Integer):Boolean;
function GetStatus(var StatusString:string):Integer;
overload; virtual;
function GetStatus : Integer; overload;
function GetSpeed : Integer;
function GetHeading : Integer;
function GetAltitude : Integer;
function GetName : string;
end;
implementation
constructor TAirplane.Create(AName : string; AKind : Integer);
begin
// Создает экземляр самолета типа AKind
// AName – идентификационный индекс самолета
// По умолчанию самолет находится на стоянке
inherited Create;
Name := AName;
Kind := AKind;
Status := OnRamp;
// Установим потолок (Ceiling) в зависимости от типа c-та
case Kind of
Airliner : Ceiling := 15000; //км
Commuter : Ceiling := 10000; //км
PrivateCraft : Ceiling := 5000; //км
end;
end;
procedure TAirplane.TakeOff(Dir : Integer);
// Реализует команду «Взлететь и лечь на курс Dir»
begin
Heading := Dir;
Status := TakingOff;
end;
procedure TAirplane.Land;
// Реализует команду «Посадка»
begin
Speed := 0;
Heading := 0;
Altitude := 0;
Status := OnRamp;
end;
function TAirplane.SendMessage(Msg:Integer;varResponse:
string; Spd:Integer; Dir:Integer; Alt:Integer):Boolean;
begin
Result := True;
{ Do something based on which command was sent. }
case Msg of
MsgTakeOff :
{ На взлет не имеет смысла, если я уже в воздухе! }
if status <> OnRamp then
begin
Response := Name + ': А я и так уже в воздухе!';
Result := False;
end else
TakeOff(dir);
MsgChange :
begin
{ Отсеивание неверных команд на изменение параметров}
if Spd > 500 then
Response:='Ошибка : Скорость больше 500.';
if Dir > 360 then
Response := Ошибка:Курс больше 360 градусов.';
if Alt < 100 then
Response := Name + ': Разобьюсь!';
if Alt > Ceiling then
Response := Name + ': Не могу забраться так высоко';
if (Spd = 0) and (Dir = 0) and (Alt = 0) then
Response := Name + ': Не понял';
if Response <> '' then
begin
Result := False;
Exit;
end;
{ Невозможно изменить состояние если ЛА на земле }
if status = OnRamp then
begin
Response := Name + ': Я еще на земле.';
Result := False;
end else
begin
Speed := Spd;
Heading := Dir;
Altitude := Alt;
Status := Cruising;
end;
end;
MsgLand :
{ Невозможно приземлиться, если и так на земле }
if status = OnRamp then
begin
Response := Name + ': Я еще на поле.';
Result := False;
end else
Land;
MsgReport :
begin
GetStatus(Response);
Exit;
end;
end;
{ Стандартная реакция, если все идет нормально. }
if Result then
Response := Name + ': Все нормально';
end;
function TAirplane.GetStatus(var StatusString:string):Integer;
begin
StatusString := Format('%s, Высота: %d, Курс: %d, ' +
'Скорость: %d', [Name, Altitude, Heading, Speed]);
Result := Status;
end;
function TAirplane.GetStatus : Integer;
begin
Result := Status;
end;
function TAirplane.GetSpeed : Integer;
begin
Result := Speed;
end;
function TAirplane.GetHeading : Integer;
begin
Result := Heading;
end;
function TAirplane.GetAltitude : Integer;
begin
Result := Altitude;
end;
function TAirplane.GetName : string;
begin
Result := Name;
end;
end.
