вторник, 28 сентября 2010 г.

Новые сюрпризы от компилятора Delphi 7

Итак, я снова возюкаюсь с чем-то чуть более сложным, чем простое рисование интерфейса и снова (в который уже интересно раз) наталкиваюсь на странности чудесного компилятора от фирмы 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.” неявно должен подставляться ко всем вызовам. Другими словами, вызовы того, что описано в родительском классе и не перекрыто, не перегружено в дочернем должны идти без указания объекта, если я правильно понимаю. Хотя может быть я что-то и путаю.

Комментариев нет:

Отправить комментарий