作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一点设计问题。我创建了一个费率计算器,如下所示:
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
使用泛型和抽象类创建工厂模式以动态生成特定类型的计算器的最佳方法是什么?
最佳答案
只保留 ICalculator
接口(interface)并将更具体的接口(interface)转换为类。我想不出一个很好的理由来创建一个类来存储一个变量,所以我要去掉 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
是什么意思,但如果它对最终用户很重要,那么您应该将其添加为附加参数。
Calculate()
被实现。如果您想为每个计算器制作更具体的工厂方法,那有点违背了目的。
关于vb.net - 在软件设计工厂模式中使用抽象泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13272471/
我是一名优秀的程序员,十分优秀!