【问题标题】:Variant record instead of overloaded object type?变体记录而不是重载的对象类型?
【发布时间】:2020-06-26 01:17:46
【问题描述】:

我正在解决一个需要动态调整数组大小的问题,在这个问题上需要大量操作。我已经成功编写了两个类,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;

这就是我的意思,但显然这种语法是诅咒。当然,有些地方方法调用和函数结果需要知道数据类型,但一旦定义它们是一致的。想法?使用变体数组并遭受减速?

【问题讨论】:

    标签: delphi overloading record variant tobject


    【解决方案1】:

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

      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;
    

    【讨论】:

    • @user3670958:注意 MBo 用 override 指令标记了析构函数。这很重要。
    • 这显然是正确的起点。如果您需要对数组中的项目执行算术运算,这当然会变得很棘手。泛型对此毫无用处。
    【解决方案2】:

    事实证明,答案会导致解决方案变得非常复杂。强打字是有原因的!因为不能有多个具有相同函数名称的函数返回类型,所以对于不同的参数类型,人们会陷入名称相似的函数中。如果你尝试

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

    那么你仍然需要在每次使用时输入 mypointer。事实证明并没有多大帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多