概括地說,我希望能夠做這樣的事情(其中T通常是記錄)泛型接口如何引用指向其類型參數的指針?
interface
ITable<T> = interface
...
other methods
...
function Append: ^T;
end;
但是,正如我們看到a question about declaring pointers based on generic types德爾福不允許^T
建設。如果允許,我可以做的東西,如:
var
myrec: PMyRec;
myTable: ITable<TMyRec>;
begin
myTable := TableFactory.Build(TMyRec);
myRec := myTable.Append;
myRec.FieldA := 'Test';
.. Do stuff with myTable containing myRec
end;
,我想這樣做的原因是,我有很多的現有代碼被寫入這樣的地獄周圍,而不是建立一個記錄然後調用接受像MyTable.Add(MyRec)
這樣的內建記錄的程序,這是類似Delphi的方式。
到鏈接的問題的解決方案是在通用類使用內部type
聲明,但通用接口不允許type
語句。
要解決這個問題,我想我或許可以使用類似Spring4D使用通用記錄返回指針爲使接口的集合:
ListRec<T> = record
type
P = ^T;
private
InternalList = IList<T>;
public
... exposed list functions
function Append: PT;
end;
function ListRec<T>.Append: PT;
var
index: integer;
TempT: TMyRec;
begin
index := InternalList.add(TempT);
result := @InternalList.Items[index];
end;
畢竟,我的問題是:有更簡單的方法來實現我的目標還是讓我大大地過度複雜?是否有明顯的缺點(除了使用指針的標準風險之外)?如果沒有其他的話,我最好選擇純粹的接口解決方案來提供可測試性。
Delphi不允許'^ Something'作爲返回類型,不管是否泛型。所以爲它定義一個類型。 –