2013-03-19 50 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