Cita:
Empezado por Lepe
En este caso se pasa un puntero (de 4 bytes) al objeto, por tanto, todos los objetos se pasan por referencia, da igual si pones const, si no lo pones, o si lo pasas con var. De las 3 formas podrás modificar las propiedades del objeto, el width, height, etc.
|
Aquí hay una inexactitud. Claro que de cualquier forma puedes modificar las propiedades de los objetos, pero no es lo mismo usar o no usar
const o usar o no usar
var.
Para empezar está el asunto de la optimización que menciona la ayuda de Delphi en cuanto al uso del const. Por otra parte lo que se pasa como
const o
var no es el objeto sino
la referencia al objeto, y ésta sí que puede cambiarse (o evitar que se haga).
Aquí un ejemplo extraído de código de Phil Brown:
Código Delphi
[-]
type
TPDClass = class of TPDObject;
TPDObject = class
protected
function GetObject(ClassType: TPDClass; var PDObject: TPDObject): TPDObject;
end;
TOrder = class(TPDObject)
private
FCustomer: TCustomer;
public
property Customer: TCustomer read GetCustomer;
end;
implementation
function TPDObject.GetObject(ClassType: TPDClass; var PDObject: TPDObject): TPDObject;
begin
if PDObject = nil then
PDObject := ClassType.Create;
Result := PDObject;
end;
function TOrder.GetCustomer: TCustomer;
begin
Result := TCustomer(GetObject(TCustomer, FCustomer));
end;
Aquí la idea es lo que llaman "lazy construction". Objetos como TOrder pueden tener objetos relacionados como TCustomer. Cuando esto se lee de la base de datos, normalmente conviene cargar el objeto relacionado sólo cuando se le llame.
Phil Brown utiliza un método genérico en la clase base para cargar los objetos relacionados de manera que los descendientes simplemente tengan que hacer un moldeo al tipo de datos adecuado.
En este método base, GetObject, el campo que respalda la propiedad (FCustomer en el caso de TOrder), aún no ha sido creado la primera vez que se le llama. Y lo que GetObject está cambiando es la
referencia al objeto (de hecho está creando una nueva). Para ello fue imprescindible el uso de
var en la declaración de GetObject.
// Saludos