2015-11-23 62 views
1

概括地說,我希望能夠做這樣的事情(其中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; 

畢竟,我的問題是:有更簡單的方法來實現我的目標還是讓我大大地過度複雜?是否有明顯的缺點(除了使用指針的標準風險之外)?如果沒有其他的話,我最好選擇純粹的接口解決方案來提供可測試性。

+0

Delphi不允許'^ Something'作爲返回類型,不管是否泛型。所以爲它定義一個類型。 –

回答

2

在一個理想的世界裏,你就可以直接聲明泛型指針類型:

type 
    P<T> = ^T; 

但語言不允許這樣。您可以聲明泛型指針類型,但前提是它們包含在另一種類型中。例如:

type 
    PointerTo<T> = record 
    type 
     P = ^T; 
    end; 

現在你的接口可以是:

type 
    ITable<T> = interface 
    function Append: PointerTo<T>.P; 
    end; 

坦率地說,在我看來,這是相當跛腳。

+0

今天太遲了,但明天我會放棄它 - 可能會瘸腿,但它只會在一個地方存在,所以不必經常看它;-) –