ObjInterface ObjVoice;
function voice(): void;
end;
VipInterface Voice Implements ObjVoice licensed(Free);
public:
static: function getUpAndSing(a: word = 3): ObjVoice;
end;
Interface Voice;
function getUpAndSing(a: word = 3): ObjVoice;
{
var oi_result : ObjVoice(Voice) new;
result := oi_result;
}
function ObjVoice.voice(): void;
{
message('!');
}
end.
Interface test;
handleEvent
cmInit:
{
Voice::getUpAndSing().voice; // ОК
Voice::getUpAndSing.voice; // <- ExIfcBadCheckSum (ExRef) в EPA_TEST::Voice несовпадение контрольной суммы ObjInterface ( 1 )
}
end;
end.
Итак, если у нас был метод, возвращающий ссылку на объект, и мы потом вдруг решили добавить к нему необязательный параметр, то во всём коде, который раньше использовал этот метод нужно будет проставить скобки ^^
Необязательны. Но допустимы. То есть, можно при вызове любой процедуры/функции, не принимающей параметров или принимающей только параметры по умолчанию, понаставить пустых скобок: "CallMeTender()".
А то, что в описанном случае скобки оказались обязательны - это есть невежливость компилятора, который мог бы проверить не только количество параметров, но и их флаги и не требовать скобки столь ревностно.
Описание.
У нас имеется метод, принимающий необязательный параметр и возвращающий какой-то объект. В моём примере это статический метод getUpAndSign() интерфейса Voice. Метод возвращает новый экземпляр ObjVoice.
Т.е. чтобы вызвать метод voice объектного интерфейса ObjVoice я могу написать Voice::getUpAndSing().voice или Voice::getUpAndSing.voice. Т.к. заявлено, что скобки к методам необязательны.
Проблема: При выполнении кода в точке Voice::getUpAndSing.voice возникает исключение ExIfcBadCheckSum (ExRef) в то время как Voice::getUpAndSing().voice работает нормально.
Спасибо за разъяснения. У меня не было возможности проверить приведённый пример. Теперь посмотрел на воспроизведение. Однозначно - в ПИР.
Какой-то косяк с вычислением контрольных сумм для методов vip-интерфейсов - публичных, с параметрами по умолчанию. Характерно, что объектные интерфейсы этим не страдают: если перенести метод getUpAndSing в ObjVoice, ошибка не воспроизводится.