2

我有一组使用子范围类型作为输入参数的函数。

const
  ImprovementNodeCount = 20;
  SaleAllocationNodeCount = 10;

type   
  TImprovementNodePrintOrders = 0..ImprovementNodeCount;
  TSaleAllocationNodePrintOrders = 0..SaleAllocationNodeCount;


  function SaleImprovementType(PrintOrder: TImprovementNodePrintOrders): TSaleReferenceRecord;

  function SaleAllocationType(PrintOrder: TSaleAllocationNodePrintOrders): TSaleReferenceRecord;
  function SaleAllocationAcres(PrintOrder: TSaleAllocationNodePrintOrders): TSaleReferenceRecord;
  // many more functions with different SubTypes

这对我来说效果很好。我有一种新情况,可以方便地将其中一个函数作为参数传递。我的子范围现在引起了问题,因为它们是不同的类型。

除了子类型之外,所有功能看起来都相同。我试图添加一个像这样的新函数类型

  TGetReferenceFunction = function (Index: cardinal): TSaleReferenceRecord;

现在编译器抱怨当我尝试将函数参数作为 TGetReferenceFunction 传递时类型不同。有什么方法可以创建一个函数类型,其中包含所有这些具有不同子类型参数的函数?

[DCC 错误] SaleNameMap.pas(295):E2010 不兼容的类型:“Cardinal”和“TImprovementNodePrintOrders”

我真正需要的是一种全是数字子类型的类型。我知道我可以为我拥有的每个子类型创建不同的函数类型,但这仍然不允许我将这些函数作为参数传递给一个通用函数。

我猜这是不可能的。如果是这样,我还有其他选择,但如果我遗漏了什么,我想我会先在这里尝试。

4

2 回答 2

4

如果您真的希望一个函数接受所有这些不同的函数类型,那么您将不得不牺牲类型安全。你可以通过演员来做到这一点:

TGetReferenceFunction(@SaleAllocationAcres)
于 2012-09-17T22:19:35.550 回答
1

你需要模拟一种匿名方法系统。

例如:

// existing typed proc
function SaleAllocationType(PrintOrder: TSaleAllocationNodePrintOrders): TSaleReferenceRecord;
function SaleAllocationAcres(PrintOrder: TSaleAllocationNodePrintOrders): TSaleReferenceRecord

Type
  // the prototype
  SaleAllocProto = function(PrintOrder: TSaleAllocationNodePrintOrders): TSaleReferenceRecord;

 // enumeration for all the existing typed procs
 TSelAllocRef = (saType,saAcres);

Const
  // array which references all your typed procs.
  SelAllocProvider = Array[TSelAllocRef] Of TSelAllocRef = (SaleAllocationType,SaleAllocationAcres);

然后你可以打电话

ASaleReferenceRecord := SelAllocProvider[saType](Myargument);
AnotherSaleReferenceRecord := SelAllocProvider[saAcres](Myargument)
于 2012-09-17T22:28:54.303 回答