Ver Mensaje Individual
  #13  
Antiguo 31-10-2012
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
Pero, por ejemplo, si haces:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  c1,c2: TMiClase;

begin
  c1 := TMiClase.Create;
  c1.Cadena:= 'XXXX';

  c2 := c1.Clone;
  c2.Cadena := 'YYYY';

  ShowMessage(c1.Cadena); // Muestra 'YYYY' en lugar de 'XXXX'
end;

Es decir, c2.Cadena y c1.Cadena hacen referencia a la misma cadena. En un clonación, el objeto clonado debería ser inicialmente igual al original en todo aspecto pero cambios posteriores no deberían afectar al otro.

Lo mismo sucedería si tu objeto tuviera otros objetos como propiedades.

Por otra parte, un string lleva un conteo de referencia que, me parece, se alteraría con una asignación usando Move. Es decir, habría dos variables apuntando a la misma cadea pero con un conteo de referencia igual a 1.

Haz la prueba:

Código Delphi [-]
var
  c1,c2: TMiClase;

begin
  c1 := TMiClase.Create;
  c1.Cadena:= 'XX';

  c2 := c1.Clone;
  c1.Free;

  c2.Cadena := 'Hola'; // Genera una violación de acceso porque la cadena origanl ya murió.
  c2.Free;
end;

Y ni qué decir de interfaces, que también llevan un conteo de referencias.

// Saludos
Responder Con Cita