Question

I am trying implement a Strategy pattern with nested classes.

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;
        }
    }
}

Testing:

        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!

Why Range it does not works? Am I doing something wrong in Range class?

Was it helpful?

Solution

There is some change required in Restriction Class and it works

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;
        }
    }
}

OTHER TIPS

Your Range class doesn't override Eval method, it overrides Evaluar method.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top