- •Глава 1
- •Структура модуля
- •Интерфейс
- •Реализация
- •Инициализация и завершение
- •Ключевые слова
- •Ключевое слово const
- •Ключевое слово type
- •Комментарии
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Константы
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Операции со строками
- •Разбиение литерала по строкам программы
- •Строковые функции
- •Множества
- •Совместимость типов данных
- •Примечание.
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Глава 2.
- •Вложенные условия. Операторы if могут быть вложены друг в друга произвольное число раз:
- •Элементы структуры цикла
- •Цикл for…
- •Цикл for с увеличением счетчика синтаксически определен как
- •Цикл for с уменьшением счетчика в общем случае имеет следующий вид
- •Функции Pred и Succ
- •Цикл while
- •Синтаксис цикла while имеет вид
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Пример записи
- •Оператор with
- •Массивы записей
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Глава 3
- •Анатомия класса
- •Наследование
- •Ключевые слова is и as
- •Что такое класс?
- •Анатомия класса
- •Указатель Self
- •Пример класса
- •Анализ объявления и реализации
- •Наследование
- •Перекрытие методов
- •Ключевые слова is и as
Анализ объявления и реализации
Численное описание (т.е. данные) класса представлено следующими полями
Имя поля |
Тип |
Описание |
Name |
string |
Уникальный идентификационный код самолета. В Российской фелерации гражданские самолеты имеют идентификацию вида RA-XXYYYY, где ХХ – код фирмы-разработчика, YYYY – серийный номер. Например, идентификационный код ИЛ-96-300 с серийным номером 7 будет RA-96007. |
Speed |
Integer |
Текущая скорость полета, выраженная в км/час. |
Altitude |
Integer |
Текущая высота полета, выраженная в метрах. Не может быть меньше 50м или больше чем потолок для данного типа самолета. |
Heading |
Integer |
Курс. Может принимать значения от 0 до 360 градусов |
Status |
Integer |
Состояние. Может принимать значение одной из следующих констант TakingOff, Cruising, Landing, OnRamp. |
Kind |
Integer |
Тип самолета. Может принимать значение одной из следующих констант Airliner, Commiter, PrivateCraft |
Ceiling |
Integer |
Потолок – максимально возможная высота для данного типа самолета. |
При управлении воздушным движением диспетчер дает «пилоту» команды. Команда может быть выполнена если не противоречит текущему состоянию самолета. Например, нельзя посадить самолет, который еще не взлетел. Факт выполнения команды фиксируется изменением значений полей Speed, Altitude, Heading и Status. Все поля скрытые. В данном случае необходимость сокрытия полей от пользователя очевидна. Действительно, диспетчер, как пользователь объекта рассматриваемого класса, сам не может изменить ни скорость, ни высоту полета самолета. Он это делает через посредника – пилота, который держит «рычаги управления». В рамках нашей абстракции роль пилота будет выполнять специальный метод, который имеет право изменять состояние и параметры движения самолета.
Класс TAirplane имеет 2 скрытых и 8 публичных методов. Сначала рассмотрим функции публичных методов в порядке их появления в объявлении класса.
Конструктор класса TAirplane инициализирует объект как некий самолет типа AKind c уникальным идентификатором AName. Так как первым вызывается конструктор предка (в данном случае предком является класс TObject), то все поля нашего класса очищаются, т.е. получают нулевые значения. По умолчанию (т.е. при создании объекта) считается, что самолет находится на земле. Далее в зависимости от типа самолета устанавливается потолок в метрах.
Метод SendMessage выполняет роль пилота – посредника между диспетчером и самолетом. Его функция – выполнить команду диспетчера, если ее смысл не противоречит текущему состоянию самолета. Данный метод имеет 4 входных параметра, один выходной и результат исполнения функции булевского типа.
Входными параметрами являются:
Msg – код команды диспетчера. Возможные коды команд предопределены константами с именами MsgXXXX в разделе const модуля AirplanU;
Spd – новое значение скорости полета;
Dir – новый курс;
Alt – новый эшелон (высота полета).
Выходной параметр метода – строка Response. Сюда заносится текст «реакции» пилота на команду диспетчера.
Метод с помощью оператора case анализирует код команды и выполняет соответствующие действия. Читателю предлагается разобраться в логике этого метода самостоятельно. Обратим внимание на то что здесь используются два защищенных метода TakeOff и Land, реализующие правила взлета и посадки.
Перегружаемый метод GetStatus предназначен для «обратной связи» самолета с диспетчером. В его задачу входит чтение и возврат значения скрытого поля Status. С одной стороны, этот метод имеет один параметр – переменную типа «строка». С другой стороны, параметров нет. В первом случае функция GetStatus вернет числовой эквивалент текущего состояния самолета, записанный в поле Status, а фактический параметр будет содержать отформатированный текст сообщения о состоянии данного самолета, например:
«RA–96007 Высота: 10000 Курс: 129 Скорость: 950».
Во втором случае (т.е. когда при обращении к GetStatus параметры не указаны), метод – функция просто вернет текущее значение поля Status.
Смысл остальных методов GetXXXX очевиден.
Защищенные (protected) методы TakeOff и Land предназначены для инкапсуляции правил взлета и посадки. Поскольку методы защищены, к ним нельзя обратиться вне метода SendMessage. С другой стороны, гражданские (пассажирские) самолеты взлетают и приземляются не так, как это делают высокоманевренные военные истребители. Следовательно, нам следует позаботиться о возможности модификации класса в будущем. Такая возможность поддерживается вынесением правил в отдельные методы, которые можно перекрыть (т.е. изменить поведение), не затрагивая «систему управления» – метод SendMessage. Отметим, что объявление этих методов виртуальными (virtual) означает, что в будущем код этих методов будет перекрыт особым образом. Тонкости перекрытия методов рассматриваются ниже в разделе «Наследование».
