我要做的是向這兩個具有相同間接祖先的類添加通用方法。
IMyMethods = interface
procedure SomeMethod;
end;
TMyADODataset =class(TADODataset, IMyMethods) // ADO
public
procedure SomeMethod;
end;
TMyUniDataset =class(TUniTable, IMyMethods) // UniDAC
public
procedure SomeMethod;
end;
SomeMethodADO 和 UniDAC 的實作方式不同。所以我認為界面是完美的。
然后我們有
TMyTable =class
private
FDataset: TDataset;
end;
這里我選擇了 TDataset,因為它是 TADODataset 和 TUniTable 的共同祖先。
FDataset 可以如下實體化:
if FProvider = prADO then
FDataset := TMyADODataset.Create
else
FDataset := TMyUniDataset.Create;
現在的問題是如何呼叫SomeMethodof FDataset,以下不編譯并給出型別不兼容錯誤:
IMyMethods(FDataset).SomeMethod;
這是因為TDataset沒有實作IMyMethods,這是正確的。但是有什么辦法可以欺騙編譯器接受這個嗎?還是有更好的解決方案?我想到了類助手,但是SomeMethodADO 和 UniDAC 的實作會有所不同。
uj5u.com熱心網友回復:
使用SysUtils.Supports()函式從物件中獲取IMyMethods介面FDataset,例如:
uses
..., SysUtils;
var
Intf: IMyMethods;
...
if Supports(FDataset, IMyMethods, Intf) then
Intf.SomeMethod;
請注意,為了使其正常作業,IMyMethods需要為其分配一個 Guid,例如:
type
IMyMethods = interface
['{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}']
procedure SomeMethod;
end;
您可以通過按 直接在代碼編輯器中生成新的 Guid Ctrl Shift G。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469379.html
標籤:德尔福
