- •Глава 1
- •Структура модуля
- •Интерфейс
- •Реализация
- •Инициализация и завершение
- •Ключевые слова
- •Ключевое слово const
- •Ключевое слово type
- •Комментарии
- •Переменные
- •Типы данных и переменные
- •Преобразование типов
- •Знаки операций
- •Константы
- •Массивы
- •Одномерные массивы
- •Многомерные массивы
- •Функции Low и High
- •Динамические массивы
- •Короткая строка
- •Длинная строка
- •Операции со строками
- •Разбиение литерала по строкам программы
- •Строковые функции
- •Множества
- •Совместимость типов данных
- •Примечание.
- •Указатели
- •Статические и динамические переменные
- •Размещение динамических переменных
- •Разыменование указателя
- •Глава 2.
- •Вложенные условия. Операторы if могут быть вложены друг в друга произвольное число раз:
- •Элементы структуры цикла
- •Цикл for…
- •Цикл for с увеличением счетчика синтаксически определен как
- •Цикл for с уменьшением счетчика в общем случае имеет следующий вид
- •Функции Pred и Succ
- •Цикл while
- •Синтаксис цикла while имеет вид
- •Цикл repeat
- •Управление циклами
- •Оператор goto
- •Оператор case
- •Область видимости идентификаторов
- •Пример записи
- •Оператор with
- •Массивы записей
- •Подпрограммы
- •Процедуры и функции
- •Объявление и определение подпрограммы
- •Параметры подпрограмм
- •Локальные процедуры и функции
- •Перегрузка подпрограмм
- •Параметры по умолчанию
- •Глава 3
- •Анатомия класса
- •Наследование
- •Ключевые слова is и as
- •Что такое класс?
- •Анатомия класса
- •Указатель Self
- •Пример класса
- •Анализ объявления и реализации
- •Наследование
- •Перекрытие методов
- •Ключевые слова is и as
Локальные процедуры и функции
Локальной функцией или процедурой называется подпрограмма, которая описана внутри другой подпрограммы. Рассмотрим пример:
procedure TForm1.Button1Click(Sender:TObject);
var
X : Integer;
{ Локальная процедура }
procedure Test;
begin
Memo1.Lines.Add(Локальная процедура, X = + IntToStr(X));
end;
begin
X := 100;
Memo1.Lines.Clear;
Memo1.Lines.Add(Основная процедура, X = + IntToStr(X));
Test;
end;
Обратите внимание на то, что описание процедуры Test находится в разделе объявления переменных метода Button1Click. Процедура Test называется локальной постольку поскольку ее описанием владеет другая процедура. Локальная процедура доступна только ее владельцу.
Важным свойством локальных подпрограмм является то что им доступны любые переменные своего владельца. В нашем примере переменная X доступна как подпрограмме Button1Click, так и локальной процедуре Test. Если выполнить код, показанный выше, компонент Memo1 отобразит следующий текст:
Основная процедура, X = 100
Локальная процедура, X = 100
Перегрузка подпрограмм
Часто возникает необходимость выполнения одних и тех же действий над данными различных типов. Например, стандартная функция извлечения квадратного корня Sqrt возвращает значение, тип которого совпадает с типом аргумента целого или вещественного. Object Pascal, начиная с Delphi 4, предоставляет разработчикам объявлять одноименные функции и процедуры, принимающие аргументы различных типов. Это называется перегрузкой функций.
Новый термин. Перегрузка методов позволяет объявить две (и более) процедуры (или функции) с одинаковыми именами, но с различными списками параметров.
Выше мы рассмотрели пример программы с функцией Multiply, которая возвращает результат перемножения двух целых чисел. Допустим, что нам необходимо иметь также и функции, которые перемножают числа типа Double или Word.
Благодаря перегрузке, объявления соответствующих функций принимают вид:
function Multiply(Num1, Num2 : Integer) : Integer; overload;
function Multiply(Num1, Num2 : Double) : Double; overload;
function Multiply(Num1, Num2 : Word) : Word; overload;
Все функции имеют одно и то же имя (Multiply), но в их объявлении присутствует директива overload. Код реализации каждой из этих функций необходимо привести в секции implementation модуля, где они объявлены. При этом не надо обращать внимание на то, что эти функции выполняют одни и те же действия:
implementation
function Multiply(Num1, Num2 : Integer) : Integer; overload;
begin
Result := Num1 * Num2;
end;
function Multiply(Num1, Num2 : Double) : Double; overload
begin
Result := Num1 * Num2;
end;
function Multiply(Num1, Num2 : Word) : Word; overload;
begin
Result := Num1 * Num2;
end;
При использовании любой из перегружаемых функций компилятор обеспечит вызов именно той из них, которой мы передадим параметры соответствующего типа. Например, в следующем фрагменте кода
var
X, Y, Z : Double;
begin
X := 1.5;
Y := 10.5;
Z := Multiply(X, Y);
end;
будет вызвана та версия функции Multiply, которая «принимает» параметры типа Double.
ПРИМЕЧАНИЕ: В качестве критерия выбора нужной версии перегружаемой функции компилятор использует список ее фактических параметров. Перегружаемая функция обязательно должна иметь параметры. Так, следующие объявления не допускаются
function DoSomething : Integer; overload;
function DoSomething : Word; overload;
В данной ситуации компилятор выдаст сообщение «Declaration of DoSomething differs from previous declaration».
Принцип перегрузки применим к процедурам, функциям и к методам объектов.
