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