0

我正在尝试使用嵌套类实现策略模式。

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 它不起作用?我在 Range 课上做错了吗?

4

2 回答 2

0

限制类需要进行一些更改,并且可以正常工作

公共类限制 { 受保护的具体限制 _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;
        }
    }
}
于 2013-03-19T06:13:10.173 回答
-1

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

于 2013-03-19T05:14:55.730 回答