Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
системный анализ и управление.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
613.89 Кб
Скачать

Пример класса

Ниже приведен текст модуля, содержащий описание класса 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.