Итак, я снова возюкаюсь с чем-то чуть более сложным, чем простое рисование интерфейса и снова (в который уже интересно раз) наталкиваюсь на странности чудесного компилятора от фирмы Borland.
Итак, что мы имеем на входе:
TLogProc=procedure(s:string); {тип для передачи ссылки на процедуру записи строки куда-то}
TMyClass=class
private
fProc:TLogProc;
function getLP:TLogProc;
…
public
property LogProc:TLogProc read getLP;
Constructor Create(…;lp:TLogProc ;…);
…
end;
Пока все просто и понятно. Процедура передается по ссылке откуда-то из-вне вселенной этого класса при создании и ссылка записывается в отведенную переменную, остается вызвать процедуру в самом классе и радоваться.
Но не все так просто. Если от этого класса унаследовать другой класс и попытаться вызвать эту процедуру, то при компиляции следующего куска кода, компилятор ругается на отсутствие точки с запятой!
Procedure ClidClass.SomeProc(const someparam:String);
begin
…
// Это НЕ компилируется
//LogProc(’someone said: ’+someparam+’!’);
// А вот это уже компилируется
Self.LogProc(’someone said: ’+someparam+’!’);
…
end;
Вдумчивое курение не привело меня ни к каким мыслям. Но факт остается фактом. Интересно, все же в чем причина такого поведения со стороны компилятора. По идее префикс “Self.” неявно должен подставляться ко всем вызовам. Другими словами, вызовы того, что описано в родительском классе и не перекрыто, не перегружено в дочернем должны идти без указания объекта, если я правильно понимаю. Хотя может быть я что-то и путаю.
Комментариев нет:
Отправить комментарий