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
,或 TFilterElement
和 TSlicerElement
的任何其他共同祖先:
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
,其中 TFilterElement
和 TSlicerElement
作为后代 classes?
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
,或 TFilterElement
和 TSlicerElement
的任何其他共同祖先:
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
,其中 TFilterElement
和 TSlicerElement
作为后代 classes?