Углубленный взгляд на копирование объектов в Delphi: методы и примеры кода

При работе с объектно-ориентированными языками программирования, такими как Delphi, важно понимать, как эффективно копировать объекты. В этой статье мы рассмотрим различные методы копирования объектов в Delphi, а также приведем примеры кода, иллюстрирующие каждый метод. Если вам нужно выполнить глубокое или поверхностное копирование, или если вы заинтересованы в использовании конструкторов копирования или сериализации, мы предоставим вам все необходимое.

  1. Поверхностное копирование.
    Поверхностное копирование создает новый объект, который использует ссылки на те же данные, что и исходный объект. Чтобы выполнить поверхностное копирование в Delphi, вы можете использовать метод Assign. Вот пример:
type
  TMyObject = class(TObject)
    public
      Data: Integer;
      procedure Assign(Source: TObject); override;
  end;
procedure TMyObject.Assign(Source: TObject);
begin
  if Source is TMyObject then
    Data := TMyObject(Source).Data;
end;
var
  obj1, obj2: TMyObject;
begin
  obj1 := TMyObject.Create;
  obj1.Data := 10;

  obj2 := TMyObject.Create;
  obj2.Assign(obj1);

  // obj1 and obj2 now share the same data
end;
  1. Глубокое копирование.
    При глубоком копировании создается новый объект с отдельной копией всех данных. Delphi не предоставляет встроенной поддержки глубокого копирования, поэтому вам придется реализовать ее вручную. Вот пример:
type
  TMyObject = class(TObject)
    public
      Data: Integer;
      function Clone: TMyObject;
  end;
function TMyObject.Clone: TMyObject;
begin
  Result := TMyObject.Create;
  Result.Data := Data;
end;
var
  obj1, obj2: TMyObject;
begin
  obj1 := TMyObject.Create;
  obj1.Data := 10;

  obj2 := obj1.Clone;

  // obj1 and obj2 are separate objects with the same data
end;
  1. Конструкторы копирования.
    Конструкторы копирования предоставляют удобный способ создания нового объекта путем копирования данных из существующего объекта. В Delphi нет встроенных конструкторов копирования, но их можно реализовать вручную. Вот пример:
type
  TMyObject = class(TObject)
    public
      Data: Integer;
      constructor Create(Source: TMyObject);
  end;
constructor TMyObject.Create(Source: TMyObject);
begin
  Data := Source.Data;
end;
var
  obj1, obj2: TMyObject;
begin
  obj1 := TMyObject.Create;
  obj1.Data := 10;

  obj2 := TMyObject.Create(obj1);

  // obj2 is a new object with the same data as obj1
end;
  1. Сериализация:
    Сериализация включает преобразование объекта в поток байтов для его хранения или передачи, а затем восстановление объекта из потока. Delphi обеспечивает поддержку сериализации через такие классы, как TStream и TBinaryWriter. Вот пример:
type
  TMyObject = class(TObject)
    public
      Data: Integer;
      procedure SaveToStream(Stream: TStream);
      class function LoadFromStream(Stream: TStream): TMyObject;
  end;
procedure TMyObject.SaveToStream(Stream: TStream);
begin
  Stream.Write(Data, SizeOf(Data));
end;
class function TMyObject.LoadFromStream(Stream: TStream): TMyObject;
begin
  Result := TMyObject.Create;
  Stream.Read(Result.Data, SizeOf(Result.Data));
end;
var
  obj1, obj2: TMyObject;
  stream: TMemoryStream;
begin
  obj1 := TMyObject.Create;
  obj1.Data := 10;

  stream := TMemoryStream.Create;
  obj1.SaveToStream(stream);

  stream.Position := 0;
  obj2 := TMyObject.LoadFromStream(stream);

  // obj2 is a new object with the same data as obj1
end;

Копировать объекты в Delphi можно различными способами. Если вам нужна мелкая копия, глубокая копия, конструкторы копирования или сериализация, понимание этих методов поможет вам эффективно управлять дублированием объектов в ваших приложениях Delphi.