2013-03-19 52 views
0

我正在尝试使用嵌套类实现策略模式。在c#中实现策略模式时出现错误

public class Restriction 
{ 
    protected SpecificRestriction _specificRestriction; 

    public void SetGreaterRestriction(decimal value) 
    { 
     Greater greaterRestriction = new Greater(); 
     greaterRestriction.GreaterValue = value; 
     _specificRestriction = greaterRestriction; 
    } 

    public void SetLessRestriction(decimal value) 
    { 
     Less lessRestriction = new Less(); 
     lessRestriction.LessValue = value; 
     _specificRestriction = lessRestriction; 
    } 

    public void SetRangeRestriction(decimal lessValue, decimal greaterValue) 
    { 
     Range r = new Range(); 
     r.GreaterValue= greaterValue; 
     r.LessValue= lessValue; 
     _specificRestriction = r; 
    } 

    public bool Eval(decimal Value2) 
    { 
     return _specificRestriction.Eval(Value2); 
    } 


    /* Nested strategies classes */ 

    protected abstract class SpecificRestriction 
    {  
     public abstract bool Eval(decimal Value); 
    } 

    protected class Less : SpecificRestriction 
    { 
     public decimal LessValue { get; set; } 
     public override bool Eval(decimal lessValue) 
     { 
      return lessValue < LessValue ; 
     } 
    } 

    protected class Greater : SpecificRestriction 
    { 
     public decimal GreaterValue { get; set; } 
     public override bool Eval(decimal greaterValue) 
     { 
      return greaterValue > GreaterValue; 
     } 
    } 

    protected class Range : SpecificRestriction 
    { 
     public decimal LessValue { get; set; } 
     public decimal GreaterValue { get; set; } 

     public override bool Eval(decimal mediumValue) 
     { 
      return LessValue <= mediumValue && mediumValue <= GreaterValue; 
     } 
    } 
} 

测试:

 Restriction r = new Restriction(); 

     r.SetLessRestriction(12); 
     r.Eval(13) // Return false <- Works! 
     r.Eval(11) // Return True <- Works! 


     r.SetGreaterRestriction(12); 
     r.Eval(13)  // Return True <- Works! 
     r.Eval(11)  // Return False <- Works! 

     r.SetRangeRestriction(12, 15); 
     r.Eval(13) // Return false  <- It does not works 
     r.Eval(11) // Return false  <- Works! 
     r.Eval(16) // Return false  <- Works! 

为什么射程它不工作?我在Range类中做错了什么?

+0

看来,我认为r.Eval(13)应返回true。你应该真的把它重构成单元测试。你基本上已经有了一个单元测试。你是说它返回false,还是应该返回false? – Aron 2013-03-19 05:14:07

+0

它不起作用,因为应该返回true。 – 2013-03-19 11:55:31

回答

0

中有限制等级所需的一些变化和它的作品

公共类限制 { 保护SpecificRestriction _specificRestriction;

public void SetGreaterRestriction(decimal value) 
    { 
     Greater greaterRestriction = new Greater(); 
     greaterRestriction.GreaterValue = value; 
     _specificRestriction = greaterRestriction; 
    } 

    public void SetLessRestriction(decimal value) 
    { 
     Less lessRestriction = new Less(); 
     lessRestriction.LessValue = value; 
     _specificRestriction = lessRestriction; 
    } 

    public void SetRangeRestriction(decimal lessValue, decimal greaterValue) 
    { 
     Range r = new Range(); 
     r.GreaterValue = greaterValue; 
     r.LessValue = lessValue; 
     _specificRestriction = r; 
    } 

    public bool Eval(decimal Value2) 
    { 
     return _specificRestriction.Eval(Value2); 
    } 


    /* Nested strategies classes */ 

    protected abstract class SpecificRestriction 
    { 
     public abstract bool Eval(decimal Value); 
    } 

    protected class Less : SpecificRestriction 
    { 
     public decimal LessValue { get; set; } 
     public override bool Eval(decimal lessValue) 
     { 
      return lessValue < LessValue; 
     } 
    } 

    protected class Greater : SpecificRestriction 
    { 
     public decimal GreaterValue { get; set; } 
     public override bool Eval(decimal greaterValue) 
     { 
      return greaterValue > GreaterValue; 
     } 
    } 

    protected class Range : SpecificRestriction 
    { 
     public decimal LessValue { get; set; } 
     public decimal GreaterValue { get; set; } 

     public override bool Eval(decimal mediumValue) 
     { 
      return LessValue <= mediumValue && mediumValue <= GreaterValue; 
     } 
    } 
} 
+0

很好,谢谢!但我没有找到你的chages。 – 2013-03-19 11:47:26

-1

您的Range类不会覆盖Eval方法,它将重写Evaluar方法。

+1

-1我很确定这不是翻译中唯一的拼写错误。很明显,它是从另一种语言翻译的,如果这是问题,它就不会编译......注意_restriccionEspecifica vs _specificRestriction – Aron 2013-03-19 05:16:40

+0

@Aron,我认为这个答案不值得-1(可能会被视为评论),但真的很难区分拼写错误和实际问题。这样的样本无法编译 - 所以它有一个选项,它被从大框架中删除,其中有'* Evaluar'方法,这可能会解释代码的奇怪行为。 – 2013-03-19 05:40:18

+0

现在锁定..... – Aron 2013-03-19 07:59:30