Приведение типов
Мне всегда казалось, что TType(Var) и Var as TType работает одинаково или, в крайнем случае, очень похоже. Так было до не давнего времени.
Вместе со
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;type
TA = class
function GetResult: Integer; //virtual;
end;TB = class(TA)
function GetResult: Integer; //override;
end;{ TA }
function TA.GetResult: Integer;
begin
Result := 10;
end;{ TB }
function TB.GetResult: Integer;
begin
Result := 20;
end;var
B: TB;begin
B := TB.Create;
WriteLn(IntToStr(TA(B).GetResult));
WriteLn(IntToStr((B as TA).GetResult));ReadLn;
end.
Как по-вашему, что будет выведено, в результате данного кода? Если вы считаете, что будет выведено два раза '10', то вы не угадали. Будет выведено '10' и '20'.
Т.е. (B as TA).GetResult вызовет метод GetResult класса TB, а не TA. Природу данного глюка мне познать, пока еще, не удалось. Выводы пока-то не однозначные: при приведении типа через AS, результат необходимо присваивать какой-то переменной, т.к. иначе он "теряется". Такие выводы появились в связи с тем, что следующий код работает как надо:
var
B: TB;D: TA;
begin
B := TB.Create;
WriteLn(IntToStr(TA(B).GetResult));D := B as TA;
WriteLn(IntToStr(D.GetResult));ReadLn;
end.
Так что на будущее - аккуратнее с типами.
P.S.: кстати, напоминаю, что конкурс продолжается, вот только пока что ни одной статьи я не увидел. Огорчает.