Вариативность функций во FreePascal Как это работает?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Risto
незнакомец
Сообщения: 9
Зарегистрирован: 10.03.2016 03:11:38

Вариативность функций во FreePascal Как это работает?

Сообщение Risto »

Первая ситуация: Есть класс, в котором объявлена процедура

Код: Выделить всё

procedure SetDefaultValue(DefValue:integer);
procedure SetDefaultValue(DefValue:real);
procedure SetDefaultValue(DefValue:string);
procedure SetDefaultValue(DefValue:char);
procedure SetDefaultValue(DefValue:boolean);


Аналогичные конструкции можно видеть и в родных подключаемых модулях Lazarus, например fpjson. При этом, как я понимаю, будет вызвана та подпрограмма, в аргументах которой указана переменная того же типа, что и переданная в вызове процедуры. Почему это работает, несмотря на отсутствие директивы overload? Когда эту директиву нужно использовать, а когда можно (или нужно) опустить?

Вторая ситуация: Процедуры объявлены в родительском классе

Код: Выделить всё

procedure SetDefaultValue(DefValue:integer);dynamic;abstract;
procedure SetDefaultValue(DefValue:real);dynamic;abstract;
procedure SetDefaultValue(DefValue:string);dynamic;abstract;
procedure SetDefaultValue(DefValue:char);dynamic;abstract;
procedure SetDefaultValue(DefValue:boolean);dynamic;abstract;


И по одной переопределены в пяти классах потомках, с дерективой override. Будет ли работать такая конструкция и, если нет, то почему?
sts
энтузиаст
Сообщения: 548
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

overload поможет

Код: Выделить всё

    procedure SetDefaultValue(DefValue:integer); overload;
    procedure SetDefaultValue(DefValue:real); overload;
    procedure SetDefaultValue(DefValue:string); overload;
    procedure SetDefaultValue(DefValue:char); overload;
    procedure SetDefaultValue(DefValue:boolean); overload;
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Risto писал(а):Почему это работает, несмотря на отсутствие директивы overload? Когда эту директиву нужно использовать, а когда можно (или нужно) опустить?

http://www.freepascal.org/docs-html/ref/refse92.html
Prior to version 1.9 of the compiler, the overloaded functions needed to be in the same unit. Now the compiler will continue searching in other units if it doesn’t find a matching version of an overloaded function in one unit, and if the overload keyword is present.
If the overload keyword is not present, then all overloaded versions must reside in the same unit, and if it concerns methods part of a class, they must be in the same class, i.e. the compiler will not look for overloaded methods in parent classes if the overload keyword was not specified.

Перевести?
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Более точное описание:
The overload modifier tells the compiler that this function is overloaded. It is mainly for Delphi compatibility, as in Free Pascal, all functions and procedures can be overloaded without this modifier.

There is only one case where the overload modifier is mandatory: if a function must be overloaded that resides in another unit. Both functions must be declared with the overload modifier: the overload modifier tells the compiler that it should continue looking for overloaded versions in other units.
Risto
незнакомец
Сообщения: 9
Зарегистрирован: 10.03.2016 03:11:38

Сообщение Risto »

Перевёл, спасибо)
Ответить