Ver Mensaje Individual
  #8  
Antiguo 14-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita