簡體   English   中英

變體記錄而不是重載的 object 類型?

[英]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 數組。 將其制成單個 object 以使用變體 arrays 的唯一方法是(這會減慢速度)嗎? 變體記錄對於我正在做的事情也是低效的。 如果我能說

case mysituation of
  integerdata : (myarray1 : tarray1);
  realdata: (myarray1 : tarray2);
end;

這就是我的意思,但顯然這種語法是詛咒。 當然,有些地方方法調用和 function 結果需要知道數據類型,但是一旦定義它們是一致的。 想法? 使用變體數組並遭受減速?

一種可能的方法 - 使用 generics 制作唯一的 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;

事實證明,答案會導致解決方案變得非常復雜。 強類型是有原因的,因為不能有多個 function 返回類型具有相同的 function 名稱。 對於不同的參數類型,人們陷入了類似命名的函數中。 如果你試試

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

那么你每次使用它時仍然需要輸入 mypointer 。 事實證明並沒有太大幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM