Function Delphi-如何从函数返回不同类型

Function Delphi-如何从函数返回不同类型,function,delphi,variant,Function,Delphi,Variant,Delphi Rio-我正在编写一个类,其中一个函数是AddFilter。执行AddFilter类时,它将根据各种因素创建过滤器或切片器。(想想Excel过滤器和切片器)。我希望函数返回新创建的对象,它是tFilterElement或TSLicereElement,它们是独立的、不相关的类。我的挑战是我如何有一个函数可以返回一个新创建的对象;哪一个可以是两个不同类别中的一个?我试图在这里使用变体,但我无法让它工作。伪代码是 function TPivotTable.addFilter(param

Delphi Rio-我正在编写一个类,其中一个函数是AddFilter。执行AddFilter类时,它将根据各种因素创建过滤器或切片器。(想想Excel过滤器和切片器)。我希望函数返回新创建的对象,它是tFilterElement或TSLicereElement,它们是独立的、不相关的类。我的挑战是我如何有一个函数可以返回一个新创建的对象;哪一个可以是两个不同类别中的一个?我试图在这里使用变体,但我无法让它工作。伪代码是

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
,或者声明
TFilterElement
tLicereElement
的任何其他共同祖先:

function TPivotTable.AddFilter(...): TObject;
begin
  if SomeCondition then
    Result := TFilterElement.Create
  else
    Result := TSlicerElement.Create;
end;
使用此函数时,必须调查结果并查看其类别:

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.');
尽管如此,这似乎是一个相当糟糕的设计。(所有
都是
检查,铸造就是一个标志。)


我不知道您的应用程序,但也许您可以创建一个类
TElement
,将
TFilterElement
TsliceRelation
作为后代类?

@@Andreas-这很有效,但我必须基于TFilterElement或TSlicerElement强制执行返回。我能做到……你能解释一下为什么我的变体方法不起作用吗?@user1009073:无法保存对象。(参见第二段。)@user1009073:如果您发现编写了多次包含
TFilterElement(MyThing)
的代码块,最好声明类型为
TFilterElement
--
MyFilter
,并将对象分配给此变量:
MyFilter:=TFilterElement(MyThing)
。然后,您可以在以后每次出现时使用
MyFilter
。(但只有在您验证了
MyThing
确实是一个
t过滤关联
之后才能执行此操作)您也可以使用
绝对
关键字。使用界面如何?