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

これは私にとって非常にうまく機能しています。これらの関数の1つをパラメーターとして渡すと便利な新しい状況があります。私のサブレンジはタイプが異なるため、問題を引き起こしています。

サブタイプを除いて、すべての関数は同じように見えます。このような新しい関数型を追加しようとしました

  TGetReferenceFunction = function (Index: cardinal): TSaleReferenceRecord;

現在、コンパイラは、関数パラメータをTGetReferenceFunctionとして渡そうとすると、型が異なると文句を言います。異なるサブタイプパラメータを持つこれらすべての関数を含む関数型を作成する方法はありますか?

[DCCエラー]SaleNameMap.pas(295):E2010互換性のないタイプ:「Cardinal」および「TImprovementNodePrintOrders」

私が本当に必要としているのは、すべて数値のサブタイプであるタイプです。サブタイプごとに異なる関数型を作成できることはわかっていますが、それでもこれらの関数をパラメーターとして1つの共通関数に渡すことはできません。

これは不可能だと思います。もしそうなら、私は他のいくつかのオプションがありますが、何かが足りない場合は、最初にここで試してみようと思いました。

4

2 に答える 2

4

1つの関数がこれらの異なる関数型をすべて受け入れるようにしたい場合は、型の安全性を犠牲にする必要があります。あなたはキャストでこれを行うことができます:

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 に答える