¿Cuáles son los pros y los contras de la duplicación de una instancia de objeto con el constructor o la función de instancia?Forma correcta de duplicar el objeto Delphi
Ejemplo A:
type
TMyObject = class
strict private
FField: integer;
public
constructor Create(srcObj: TMyObject); overload;
//alternatively:
//constructor CreateFrom(srcObj: TMyObject);
property Field: integer read FField;
end;
constructor TMyObject.Create(srcObj: TMyObject);
begin
inherited Create;
FField := srcObj.Field;
end;
Ejemplo B:
type
TMyObject = class
strict private
FField: integer;
public
function Clone: TMyObject;
property Field: integer read FField;
end;
function TMyObject.Clone: TMyObject;
begin
Result := TMyObject.Create;
Result.FField := FField;
end;
Una gran diferencia de inmediato viene a la mente - en este último caso el constructor Crear tendría que ser virtual para que una jerarquía de clases de apoyo El clon podría construirse basándose en el TMyObject.
Supongamos que esto no es un problema, que TMyObject y todo lo que se basa en él está completamente bajo mi control. ¿Cuál es tu forma preferida de hacer copy constructor en Delphi? ¿Qué versión encuentras más legible? ¿Cuándo utilizarías el enfoque anterior o posterior? Discutir. :)
EDIT: Mi principal preocupación con el primer ejemplo es que el uso es muy pesada en comparación con el segundo enfoque, es decir
newObj := TMyObject.Create(oldObj)
vs
newObj := oldObj.Clone;
Edit2 o "¿Por qué Deseo una operación de línea única "
Acepto que Assign es un enfoque razonable en la mayoría de los casos. Incluso es razonable implementar 'constructor de copia' internamente simplemente usando assign.
Por lo general, creo esas copias cuando multiprocesamiento y paso de objetos a través de la cola de mensajes. Si la creación de objetos es rápida, por lo general paso una copia del objeto original porque eso realmente simplifica los problemas de propiedad del objeto.
OIA, yo prefiero escribir
Send(TMyObject.Create(obj));
o
Send(obj.Clone);
a
newObj := TMyObject.Create;
newObj.Assign(obj);
Send(newObj);
Yo votaría por su respuesta, pero esto destruiría su puntaje de 5.555. ;-) ¡Felicitaciones! – splash
Bueno, quiero llegar a 6666 un día :-) –
OK, aquí tienes! +1 – splash