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