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

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

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

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

Сообщение Risto » 17.03.2016 21:15:41

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

Код: Выделить всё
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. Будет ли работать такая конструкция и, если нет, то почему?
Risto
незнакомец
 
Сообщения: 9
Зарегистрирован: 10.03.2016 04:11:38

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

Сообщение sts » 17.03.2016 22:29:17

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;
sts
постоялец
 
Сообщения: 455
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение bormant » 17.03.2016 22:42:54

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.

Перевести?
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

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

Сообщение kazalex » 17.03.2016 22:49:54

Более точное описание:
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.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение Risto » 18.03.2016 22:17:33

Перевёл, спасибо)
Risto
незнакомец
 
Сообщения: 9
Зарегистрирован: 10.03.2016 04:11:38


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 224

Рейтинг@Mail.ru