相关疑难解决方法(0)

正确复制Delphi对象的方法

使用构造函数或实例函数复制对象实例的优缺点是什么?

例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;
Run Code Online (Sandbox Code Playgroud)

例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;
Run Code Online (Sandbox Code Playgroud)

一个主要的区别立即浮出水面 - 在后一种情况下,Create构造函数必须是虚拟的,以便可以基于TMyObject构建支持Clone的类层次结构.

假设这不是问题 - TMyObject和基于它的所有内容完全在我的控制之下.在Delphi中进行复制构造函数的首选方法是什么?您觉得哪个版本更具可读性?你什么时候使用前者或后者?讨论.:)

编辑:我对第一个例子的主要关注是,与第二种方法相比,使用率非常高,即

newObj := TMyObject.Create(oldObj)
Run Code Online (Sandbox Code Playgroud)

newObj := oldObj.Clone;
Run Code Online (Sandbox Code Playgroud)

EDIT2或"我为什么要单行操作" …

delphi constructor copy-constructor

21
推荐指数
2
解决办法
3万
查看次数

如何使用泛型处理普通的动态数组?

我知道如何操纵像TList等派生的泛型类.

但是,当我想操纵一个普通的动态数组时,我遇到了困难.

如何将以下代码转换为使用泛型的版本?

//code A
function CloneArray(original: TArray_Of_TX): TArray_Of_TX;
var
  i: integer;
  copy: TX;
begin
  Result.SetLength(SizeOf(original));
  for i:= 0 to SizeOf(original) -1 do begin
    copy:= TX.Create;
    copy.assign(original[i]);
    Result[i]:= copy;
  end; {for i}
end;
Run Code Online (Sandbox Code Playgroud)

如果我使用TList,通用版本将是:

//code B (works, but not on a plain dynamic array)
uses
  System.SysUtils, system.classes, Generics.Collections;

type
  TMyList<T: TPersistent, constructor > = class(TList<T>)
  public
    function CloneArray: TMyList<T>;
  end;

implementation

function TMyList<T>.CloneArray: TMyList<T>;
var
  i: integer;
  temp: T;
begin
  Result:= TMyList<T>.Create;
  for i:= 0 to SizeOf(self) -1 do …
Run Code Online (Sandbox Code Playgroud)

delphi generics

2
推荐指数
1
解决办法
692
查看次数

标签 统计

delphi ×2

constructor ×1

copy-constructor ×1

generics ×1