Delphi - 如何从函数中 return 不同的类型

Delphi - How to return different types from a function

Delphi Rio - 我正在写一个 class,其中一个函数是 AddFilter。当执行 AddFilter class 时,它会根据各种因素创建过滤器或切片器。 (想想 Excel 过滤器和切片器)。我希望函数 return 新创建的对象,它是 tFilterElement 或 tSlicerElement,它们是独立的、不相关的 classes。我的挑战是我如何拥有一个可以 return 新创建的对象的函数;哪个可以是 2 个不同的 classes 之一?我想在这里使用 Variants,但我无法让它工作。伪代码是

function TPivotTable.addFilter(params...):Variant;
var
E1 : tFilterElement;
E2 : tSlicerElement;

begin

... if this can be a Filter
E1 := TFilterElement.Create(params);
result := E1;

... else
E2 := TSlicerElement.Create; 
result := E2;
 
end;

我试过了

result := E1 as Variant;

以及

result := Variant(E1);

但都不起作用。有没有办法做到这一点?我不受变体的束缚,我只是想不出任何其他可能有效的方法。

您始终可以将结果类型声明为 TObject,或 TFilterElementTSlicerElement 的任何其他共同祖先:

function TPivotTable.AddFilter(...): TObject;
begin
  if SomeCondition then
    Result := TFilterElement.Create
  else
    Result := TSlicerElement.Create;
end;

当您使用此功能时,您必须调查结果并查看 class 它是什么:

MyThing := MyPivotTable.AddFilter(...);
if MyThing is TFilterElement then
  TFilterElement(MyThing).DoSomeFilterStuff
else if MyThing is TSlicerElement then
  TSlicerElement(MyThing).DoSomeSlicerStuff
else
  raise Exception.Create('Neither a filter nor a slicer was returned.');

综上所述,这似乎是一个相当糟糕的设计。 (所有 is 检查和转换都是这一点的标志。)

我不知道你的应用程序,但也许你可以创建一个 class TElement,其中 TFilterElementTSlicerElement 作为后代 classes?