Delphi 变量记录而不是重载的对象类型?

Delphi 变量记录而不是重载的对象类型?,delphi,overloading,record,variant,tobject,Delphi,Overloading,Record,Variant,Tobject,我正在研究一个需要动态调整数组大小的问题,在这个问题上需要进行大量操作。我已经成功地编写了两个类,t_1和t_2: tarray1 : array of longint; tarray2 : array of single; t_one = class(tobject) Public Myarray1 : tarray1; constructor create; destructor destroy; procedure oneofmany; end; t_two = cl

我正在研究一个需要动态调整数组大小的问题,在这个问题上需要进行大量操作。我已经成功地编写了两个类,t_1和t_2:

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;

这就是我的意思,但很明显,这种语法是令人憎恶的。当然,在某些地方,方法调用和函数结果需要知道数据类型,但一旦定义,它们是一致的。思想?使用variant数组会使速度变慢?

一种可能的方法-使用泛型创建唯一的类

  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;

一种可能的方法是使用泛型生成唯一的类

  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;

结果证明,答案导致了相当复杂的解决方案。这是一个强大的打字理由!因为不能有多个具有相同函数名的函数返回类型,所以对于不同的参数类型,会陷入类似命名的函数中。如果你尝试

var
  mypointer : pointer;
begin
  case argtype of
    integer: mypointer := @A;
    single : mypointer := @B;
end;

然后,您仍然需要在每次使用mypointer时键入它。结果证明这帮不了大忙。

结果是答案导致了非常复杂的解决方案。这是一个强大的打字理由!因为不能有多个具有相同函数名的函数返回类型,所以对于不同的参数类型,会陷入类似命名的函数中。如果你尝试

var
  mypointer : pointer;
begin
  case argtype of
    integer: mypointer := @A;
    single : mypointer := @B;
end;

然后,您仍然需要在每次使用mypointer时键入它。结果并没有起到很大的作用。

@user3670958:注意,MBo用override指令标记了析构函数。这很重要。这显然是正确的起点。当然,如果需要对数组中的项执行算术运算,这会变得很棘手。泛型在这方面几乎毫无用处。@user3670958:请注意,MBo用override指令标记了析构函数。这很重要。这显然是正确的起点。当然,如果需要对数组中的项执行算术运算,这会变得很棘手。泛型在这方面几乎是无用的。