我有一组使用Sub-Range类型作为输入参数的函数。
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 Error] SaleNameMap.pas(295): E2010 Incompatible types: 'Cardinal' and 'TImprovementNodePrintOrders'
我真正需要的是一种所有数字子类型。我知道我可以为每个子类型创建一个不同的函数类型,但是仍然不允许我将这些函数作为参数传递给一个公共函数。
我猜这是不可能的。如果是这样,我还有其他一些选择,但如果有遗漏的话,我想我会先尝试一下。
答案 0 :(得分:4)
如果你真的想要一个函数接受所有那些不同的函数类型,那么你将不得不牺牲类型安全性。你可以用演员表来做到这一点:
TGetReferenceFunction(@SaleAllocationAcres)
答案 1 :(得分: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)