[英]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.