1
resposta

Estou com dúvidas de como usar esse exemplo. Pode me ajudar a entender o uso ??

  public class Conta
    {

        public double Saldo { get; private set; }
        public double Valor { get; set; }
        public DateTime DataAbertura { get; set; }

        public void Deposita(double valor)
        {
            Saldo += valor;
        }

    }

   public abstract class Filtro
    {

        protected Filtro OutroFiltro { get; private set; }

        public Filtro()
        {
            this.OutroFiltro = null;
        }

        public Filtro(Filtro outroFiltro)
        {
            this.OutroFiltro = outroFiltro;
        }

        public abstract IList<Conta> Filtra(IList<Conta> contas);

        protected IList<Conta> ProximoFiltro(IList<Conta> contas)
        {
            if (this.OutroFiltro == null) return this.OutroFiltro.Filtra(contas);
            else return new List<Conta>();
        }

    }

   public class FiltroMenorQue100Reais : Filtro
    {
        public FiltroMenorQue100Reais()
        { }

        public FiltroMenorQue100Reais(Filtro outroFiltro) : base(outroFiltro)
        { }

        public override IList<Conta> Filtra(IList<Conta> contas)
        {
            IList<Conta> filtrada = new List<Conta>();

            foreach (Conta c in contas)
            {
                if (c.Valor < 100) filtrada.Add(c);
            }

            foreach (Conta c in ProximoFiltro(contas))
            {
                filtrada.Add(c);
            }

            return filtrada;
        }
    }
 public class FiltroMaiorQue500Reais : Filtro
    {
        public FiltroMaiorQue500Reais()
        { }

        public FiltroMaiorQue500Reais(Filtro outroFiltro) : base(outroFiltro)
        { }

        public override IList<Conta> Filtra(IList<Conta> contas)
        {
            IList<Conta> filtrada = new List<Conta>();

            foreach (Conta c in contas)
            {
                if (c.Valor > 50000) filtrada.Add(c);
            }
            foreach (Conta c in ProximoFiltro(contas))
            {
                filtrada.Add(c);
            }
            return filtrada;
        }
    }
 public class FiltroMesmoMes : Filtro
    {
        public FiltroMesmoMes()
        { }

        public FiltroMesmoMes(Filtro outroFiltro) : base(outroFiltro)
        { }

        public override IList<Conta> Filtra(IList<Conta> contas)
        {
            IList<Conta> filtrada = new List<Conta>();

            foreach (Conta c in contas)
            {
                if (c.DataAbertura.Month == DateTime.Now.Month && c.DataAbertura.Year == DateTime.Now.Year)
                {
                    filtrada.Add(c);
                }
            }

            foreach (Conta c in ProximoFiltro(contas))
            {
                filtrada.Add(c);
            }

            return filtrada;
        }
    }

     class Program
    {
        static void Main(string[] args)
        {


            List<Conta> contas = new List<Conta>();
            Conta conta = new Conta();
            conta.Deposita(90);
            contas.Add(conta);
            conta = new Conta();
            conta.Deposita(550);
            contas.Add(conta);

      Filtro filtro = new FiltroMenorQue100Reais(new iltroMaiorQue500Reais());

            Console.ReadKey();

/// ??????

        }
    }
1 resposta

Agora vc pode chamar o método filtra do filtro e analisar o resultado. Os filtros que vc passou como argumetno no construtor do FiltroMenorQue100Reais serão aplicados para cada uma das contas.