0

アイテムのコレクションをTCollectionに保存することを計画しています。

各アイテムは派生しTBaseItem、TCollectionItemから派生します。

これを念頭に置いてTBaseItem、アイテムが要求されたときにコレクションが返されます。

これで、それぞれTBaseItemCalculate関数が作成されます。TBaseItemこれでは、内部変数が返されるだけですが、TBaseItem関数の各派生でCalculateは、異なるパラメーターのセットが必要です。

コレクションにはCalculate All、コレクションアイテムを繰り返し処理して各Calculate関数を呼び出す関数があります。明らかに、各関数に正しいパラメーターを渡す必要があります。

これを行うには、次の3つの方法が考えられます。

  1. 基本クラスの計算関数ごとに仮想/抽象メソッドを作成し、派生クラスでオーバーライドします。これは、オブジェクトを使用するときに型キャストが不要であることを意味しますが、多くの仮想メソッドを作成し、大きなif...elseステートメントが型を検出し、正しい「calculate」メソッドを呼び出す場合、コードを記述するときに、どの型をどの型に対して呼び出すかを知る必要があるため、calculateメソッドを呼び出すとエラーが発生しやすくなります。 Error/EAbstractErrorを回避するためにパラメータを修正してください。

  2. で可能なすべてのパラメーターを使用してレコード構造を作成し、これを「計算」機能のパラメーターとして使用します。これには、必要なすべてのパラメーターを含めることができ、潜在的に非常に長いパラメーターリストを回避できるため、これを「すべて計算」関数に渡すという追加の利点があります。

  3. TBaseItemを型キャストするだけで、正しいcalculateメソッドにアクセスできます。これにより、最初のメソッドと比較して、TBaseItemがかなり整理されます。

このコレクションを処理するための最良の方法は何でしょうか?

4

1 に答える 1

1

それらがすべて異なるメソッドシグネチャを持っている場合、仮想メソッドを使用しても実際には何も得られません。静的メソッドである可能性もあります。少なくともこれまでの説明に基づいて、ケース2のような「一般的な」/「標準的な」パラメータのセットと仮想/オーバーライドされたCalculateメソッドを支持します。

于 2010-03-15T12:47:32.147 に答える