Мне нужен способ написать универсальную процедуру для воздействия на тип объекта или любого из его потомков.
Моей первой попыткой было объявить
procedure TotalDestroy(var obj:TMyObject);
но при использовании его с потомком
type TMyNewerObject = class(TMyObject);
var someNewerObject: TMyNewerObject;
TotalDestroy(someNewerObject);
Я получаю печально известную ошибку "типы формальных и фактических параметров должны быть идентичны"
Поэтому, пытаясь найти решение, я посмотрел на исходный код процедуры FreeAndNil
системы Delphi. И я нашел это удивительное заявление, вместе с этим удивительным комментарием
{ FreeAndNil frees the given TObject instance and
sets the variable reference to nil.
Be careful to only pass TObjects to this routine. }
procedure FreeAndNil(var Obj);
Это позволяет избежать ошибки проверки типа, но не использует защитную сетку.
У меня вопрос ... есть ли какой-нибудь безопасный способ проверить тип нетипизированного параметра var?
или другими словами, можете ли вы улучшить этот исходный код Delphi, чтобы предупреждение не понадобилось?
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;