变体记录而不是重载对象类型?
Variant record instead of overloaded object type?
我正在解决一个问题,在这个问题中我需要动态调整数组的大小,需要进行大量操作。我已经成功编码了两个 类、t_one 和 t_two:
tarray1 : array of longint;
tarray2 : array of single;
t_one = class(tobject)
Public
Myarray1 : tarray1;
constructor create;
destructor destroy;
procedure oneofmany;
end;
t_two = class(tobject)
Public
Myarray1 : tarray2;
constructor create;
destructor destroy;
procedure oneofmany;
end;
这两个对象的代码几乎完全相同,只是 Myarray1 是一个 single 数组,另一个是 longint 数组。将它变成单个对象以使用变体数组的唯一方法是什么(这会减慢速度)?变体记录对于我正在做的事情也是低效的。如果我可以说
case mysituation of
integerdata : (myarray1 : tarray1);
realdata: (myarray1 : tarray2);
end;
这就是我的意思,但显然这种语法令人厌恶。当然,有些地方方法调用和函数结果需要知道数据类型,但一旦定义它们就是一致的。想法?使用变体数组并遭受减速?
一种可能的方法 - 使唯一的 class 使用泛型
TA<T> = class
public
Arr : TArray<T>;
destructor destroy;override;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
A: TA<Integer>;
B: TA<Single>;
begin
A := TA<Integer>.Create;
B := TA<Single>.Create;
A.Arr := [1,2,3];
B.Arr := [Pi, Ln(2)];
Memo1.Lines.Add(A.Arr[0].ToString);
Memo1.Lines.Add(B.Arr[0].ToString);
end;
事实证明,答案会导致非常复杂的解决方案。强类型是有原因的!因为不能有多个具有相同函数名称的函数 return 类型,所以人们会陷入不同参数类型的类似命名函数中。如果你尝试
var
mypointer : pointer;
begin
case argtype of
integer: mypointer := @A;
single : mypointer := @B;
end;
那你每次用的时候还是要输入mypointer。事实证明并没有多大帮助。
我正在解决一个问题,在这个问题中我需要动态调整数组的大小,需要进行大量操作。我已经成功编码了两个 类、t_one 和 t_two:
tarray1 : array of longint;
tarray2 : array of single;
t_one = class(tobject)
Public
Myarray1 : tarray1;
constructor create;
destructor destroy;
procedure oneofmany;
end;
t_two = class(tobject)
Public
Myarray1 : tarray2;
constructor create;
destructor destroy;
procedure oneofmany;
end;
这两个对象的代码几乎完全相同,只是 Myarray1 是一个 single 数组,另一个是 longint 数组。将它变成单个对象以使用变体数组的唯一方法是什么(这会减慢速度)?变体记录对于我正在做的事情也是低效的。如果我可以说
case mysituation of
integerdata : (myarray1 : tarray1);
realdata: (myarray1 : tarray2);
end;
这就是我的意思,但显然这种语法令人厌恶。当然,有些地方方法调用和函数结果需要知道数据类型,但一旦定义它们就是一致的。想法?使用变体数组并遭受减速?
一种可能的方法 - 使唯一的 class 使用泛型
TA<T> = class
public
Arr : TArray<T>;
destructor destroy;override;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
A: TA<Integer>;
B: TA<Single>;
begin
A := TA<Integer>.Create;
B := TA<Single>.Create;
A.Arr := [1,2,3];
B.Arr := [Pi, Ln(2)];
Memo1.Lines.Add(A.Arr[0].ToString);
Memo1.Lines.Add(B.Arr[0].ToString);
end;
事实证明,答案会导致非常复杂的解决方案。强类型是有原因的!因为不能有多个具有相同函数名称的函数 return 类型,所以人们会陷入不同参数类型的类似命名函数中。如果你尝试
var
mypointer : pointer;
begin
case argtype of
integer: mypointer := @A;
single : mypointer := @B;
end;
那你每次用的时候还是要输入mypointer。事实证明并没有多大帮助。