我假设他们都是 TDataSet 的后代。
在最简单的情况下,您可以编写您只需要一个 TDataSet 参数的例程。您可以访问 TDataSet.Next 和 FieldByName。这将涵盖相当多的情况。
如果您的例程需要为每种 TDataSet 类型调用一些不同的代码,那么您最好的选择是使用接口并创建每种类型的自定义后代
IMyDataSetOperations = interface
procedure OpenSpecial;
function GetDataSet: TDataSet;
end;
TMyAnyDacTable = class(TAnyDacTable, IMyDataSetOperations)
procedure OpenSpecial;
function GetDataSet: TDataSet;
end;
TMyComponentAceTable = class(TComponentAceTable, IMyDataSetOperations)
procedure OpenSpecial;
function GetDataSet: TDataSet;
end;
procedure TMyAnyDacTable.OpenSpecial
begin
// code specific for AnyDAC dataset
end;
function TMyAnyDacTable.GetDataSet: TDataSet;
begin
result := self;
end;
然后你可以只使用 IMyDataSetOperations 接口来编写你的例程
function CalculateAverage(const AMyDataSet: IMyDataSetOperations): Currency;
var
total: Currency;
i: Count;
begin
AMyDataSet.OpenSpecial;
i := 0;
total := 0;
AMyDataSet.GetDataSet.First;
while not AMyDataSet.GetDataSet.Eof do
begin
total := total + AMyDataSet.GetDataSet.FieldByName('Amount').AsCurrency;
Inc(i);
AMyDataSet.GetDataSet.Next;
end
if i > 0 then
result := total / i
else
result := 0;
end