Necesito una forma de escribir un procedimiento genérico para actuar sobre un tipo de objeto o cualquiera de sus descendientes.cómo evitar de forma segura el error de Delphi: "los tipos de parámetros formales y reales deben ser idénticos"
Mi primer intento fue declarar
procedure TotalDestroy(var obj:TMyObject);
pero cuando se utiliza con un objeto descendiente
type TMyNewerObject = class(TMyObject);
var someNewerObject: TMyNewerObject;
TotalDestroy(someNewerObject);
me sale el error infame "tipos de parámetros formales y reales deben ser idénticos"
Entonces, mientras luchaba por encontrar una solución, miré el código fuente del procedimiento Delphi system FreeAndNil
. Y me encontré con esta declaración impresionante, junto con este sorprendente comentario
{ 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);
Evita el tipo de comprobación de errores, pero utiliza ninguna red de seguridad.
Mi pregunta es ... ¿hay alguna manera segura de verificar el tipo de un parámetro var sin tipo?
o en otras palabras, ¿puedes mejorar este código fuente Delphi para que la advertencia no sea necesaria?
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
¿No cree que el procedimiento hubiera sido escrito de manera diferente si había una manera de hacerlo? –
No lo sé, es por eso que estoy preguntando. –
PA, la respuesta a la pregunta de Lasse es * sí *. Si there * were * una mejor manera, entonces la función de la biblioteca lo habría utilizado. Dado que la función de biblioteca * no * lo usa, podemos concluir con seguridad que no hay mejor manera. –