我实施了一种策略模式。其中一种策略应该返回2个值,而其他策略则返回1个值。我目前在界面方法中使用 out param ,这是因为它可用于设置该值的一种策略,并使其对所有其他策略都为空,如以下示例所示
我想知道是否有一种更好的方法可以使一个策略返回多个值,而不必让所有其他策略都处理掉该参数(即使它们都将其设置为null) 例如:
public interface IContributionStrategy
{
decimal (decimal configuredAmt, out decimal? recurrent);
}
public class Strategy1 : IContributionStrategy
{
public Strategy1 (int param1)
{
this.Param = param1;
}
public decimal Calculate(decimal amt, out decimal? recurrent)
{
recurrent = somevalue;
//some logic that uses amt and this.Param and performs calc
return calculatedLogic;
}
public class Strategy2 : IContributionStrategy
{
public decimal Calculate(decimal amt, out decimal? recurrent)
{
recurrent = null; //having to set this to null only because its in the Calculate() in the interface and this strategy is not using the recurrent value.
//some logic that uses amt and performs calc
return calculatedLogic;
}
}
答案 0 :(得分:2)
我建议同时包含两者的类。
public class CalculateResult {
decimal amount {get;set}
decimal? recurrent {get;set}
}
答案 1 :(得分:1)
我建议您考虑两个有力的替代签名:
(1)
IEnumerable<decimal> Calculate(decimal configuredAmt);
(2)
decimal Calculate(decimal configuredAmt, Action<decimal> extra);
您可以像这样实现这些:
(1)
public IEnumerable<decimal> Calculate(decimal amt)
{
yield return 1m;
yield return 42m;
yield return 2m;
}
(2)
public decimal Calculate(decimal amt, Action<decimal> extra)
{
extra(1m);
extra(42m);
return 2m;
}
第二个选项可能会这样使用:
var s = new Strategy1();
var extras = new List<decimal>();
decimal r = s.Calculate(1m, x => extras.Add(x));
结果是r == 2m
和extras
包含1m
和42m
。
答案 2 :(得分:0)
我建议您返回包含所有必需信息作为属性的用户定义数据类型(如类,结构),而不是返回原始数据类型。
MVP