我知道如何操纵派生的通用类,如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;
如果我使用的是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 begin
temp:= T.Create;
temp.assign(self.items[i]);
Result.Add(temp);
end; {for i}
end;
但是,该代码不适用于TArray<T>
,因为您无法访问其Items
属性,但它没有。如果您使用array of ...
我不知道如何使用泛型。
如何编写上述代码A的常规/泛型版本?
另见我的回答:https://stackoverflow.com/a/23446648/650492 我的答案在这里:https://stackoverflow.com/a/23447527/650492
答案 0 :(得分:8)
type
TArray = class
class function Clone<T: TPersistent, constructor>(const original: array of T): TArray<T>; static;
end;
function TArray.Clone<T>(const original: array of T): TArray<T>;
var
i: integer;
copy: T;
begin
SetLength(Result, Length(original));
for i := 0 to Length(original) - 1 do
begin
copy := T.Create;
copy.Assign(original[i]);
Result[i] := copy;
end;
end;