5

デザインに少し問題があります。私は次のようにレート計算機を作成しました:

Public Interface ICalculator
 Property PaymentTerm As Double
 Function Calculate() As CommissionValues
 ReadOnly Property CalculationRule As CalculationRuleEnum
End Interface

Public Interface IFlexibleRateCalculator
 Inherits ICalculator
  Property TransferRate As Decimal
End Interface

Public Interface IFixedRateCalculator
 Inherits ICalculator
  Property ContractRate As Decimal
End Interface

Public Interface IRateSettingBase
  Property RateType As RateTypeEnum
  ReadOnly Property Calculator As ICalculator
End Interface

Public MustInherit Class RateSetting
 Implements IRateSettingBase
  Public MustOverride ReadOnly Property Calculator() As ICalculator Implements IRateSettingBase.Calculator

私はこのようなことをすることができます:

dim ratevalues as RateValues = RateSetting().Calculator.Calculate()

ものすごく単純。問題は、各タイプの計算機には、Calculate()メソッドが正しく機能するために設定する必要のある独自のプロパティのセットがあることです。だから私は次のように実装する必要があります

FlexibleRateCalculator
Implements IFlexibleRateCalculator
    Private mRequestedRate As Decimal
    Public Function Calculate() As RateValues Implements ICalculator.Calculate
    
FixedRateCalculator
 Implements IFixedRateCalculator
    Private mTransferRate As Decimal
    Public Function Calculate() As RateValues Implements ICalculator.Calculate

ジェネリックスと抽象クラスを使用して、特定のタイプの計算機を動的に生成するファクトリパターンを作成するための最良の方法は何ですか?

多くの計算レートが追加され、計算ロジックに必要な独自のパラメーターですべて変更されるため、非常に一般的なソリューションが必要です。これをすばやく実行し、dbを介してこれらのレート計算を制御できるようにしたいと思います。C#またはVB.NetでのFYIの回答は大歓迎です:)よろしくお願いします!

4

2 に答える 2

0

IoCコンテナに精通していますか?それらが提供するファクトリタイプのサービスを使用して、特定のタイプ(列挙型、文字列など)に基づいて適切なパラメータ/プロパティを使用して適切なタイプを生成できる必要があります。

そうでない場合は、パラメーターに基づいて適切な型を生成するメソッドを持つファクトリクラスを作成できます。このメソッドは、電卓を正しくセットアップし、ICalculatorインターフェースを介してそれを返すために必要なプロパティを含むParamArrayまたは他のオブジェクトを受け入れることができます。

于 2012-11-08T12:18:42.533 に答える
0

インターフェイスのみを保持ICalculatorし、より具体的なインターフェイスをクラスに変換します。変数を格納するためだけにクラスを作成する理由は考えられないので、RateSetting完全に削除します。

Public Interface ICalculator
    Property Rate As Double
    Property PaymentTerm As Double
    Function Calculate() As CommissionValues
    ReadOnly Property CalculationRule As CalculationRuleEnum
End Interface

Public Class FlexibleRateCalculator : Implements ICalculator

    Public Sub New(rate As Double)
        Me.Rate = rate
    End Sub

    '
    ' ICalculator implementation goes here
    '

End Class

Public Class FixedRateCalculator : Implements ICalculator

    Public Sub New(rate As Double)
        Me.Rate = rate
    End Sub

    '
    ' ICalculator implementation goes here
    '

End Class

Public Enum RateType
    Flexible = 1
    Fixed = 2
End Enum

Public Class CalculatorFactory

    Public Shared Function GetCalculator(rate As Double, type As RateType) As ICalculator
        Select Case type
            Case RateType.Flexible
                Return New FlexibleRateCalculator(rate)
            Case RateType.Fixed
                Return New FixedRateCalculator(rate)
            Case Else
                Throw New ArgumentException
        End Select
    End Function

End Class

レートとレートタイプをGetCalculatorメソッドに渡すことにより、オブジェクトインスタンスを作成します。の意味はわかりませんがCalculationRule、エンドユーザーにとって重要な場合は、追加のパラメーターとして追加する必要があります。

ファクトリメソッドでselectステートメントを更新することを忘れない限り、ICalculatorを実装する計算機タイプを簡単に追加できます。

編集:もちろん、オブジェクトインスタンスを返す前に追加のプロパティを設定することもできます。Calculate()ただし、このパターンのポイントは、エンドユーザーが実装方法について知る必要がないことを確認することです。すべての計算機に対してより具体的なファクトリメソッドを作成したい場合、それは目的を打ち破ります。

于 2013-01-06T07:17:18.590 に答える