Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Aula 5 - Exercício final

Caros, o resultado da Conta de estudante está zerado. Poderiam dar uma ajuda?

public class Program //ProcessadorDeInvestimentos
    {

        static void Main(string[] args)
        {
            IList<ContaComum> contas = ContasDoBanco();

            foreach (ContaComum conta in contas)
            {
                conta.somaInvestimento();

                Console.WriteLine("Novo saldo: " + conta.Saldo());
            }

            Console.ReadLine();
        }

        private static IList<ContaComum> ContasDoBanco()
        {
            List<ContaComum> contas = new List<ContaComum>();
            contas.Add(umaContaComum(100));
            contas.Add(umaContaComum(150));
            contas.Add(umaContaEstudante(200));
            return contas;
        }

        private static ContaEstudante umaContaEstudante(double saldo)
        {
            ContaEstudante conta = new ContaEstudante();
            conta.Deposita(saldo);
            return conta;
        }

        private static ContaComum umaContaComum(double saldo)
        {
            ContaComum conta = new ContaComum();
            conta.Deposita(saldo);
            return conta;
        }
    }

    class ContaEstudante : ContaComum
    {
        private ManipuladorDeSaldo manipuladorEstudante;
        public int Milhas { get; private set; }

        public ContaEstudante()
        {
            this.manipuladorEstudante = new ManipuladorDeSaldo();
        }

        public override void Deposita(double valor)
        {
            this.manipuladorEstudante.Deposita(valor);
            this.Milhas += (int)valor;
        }
    }

    class ContaComum
    {
        private ManipuladorDeSaldo manipulador;

        public ContaComum()
        {
            this.manipulador = new ManipuladorDeSaldo();
        }

        public virtual void Deposita(double valor)
        {
            this.manipulador.Deposita(valor);
        }

        public void Saca(double valor)
        {
            this.manipulador.Saca(valor);
        }

        public double Saldo()
        {
            return this.manipulador.Saldo;
        }

        public void somaInvestimento()
        {
            this.manipulador.SomaInvestimento(1.1);
        }
    }

    class ManipuladorDeSaldo
    {
        public double Saldo { get; private set; }

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

        public void Saca(double valor)
        {
            if (valor <= this.Saldo)
            {
                this.Saldo -= valor;
            }
            else
            {
                throw new ArgumentException();
            }
        }

        public void SomaInvestimento(double taxa)
        {
            this.Saldo *= taxa;
        }
    }
2 respostas
solução

Olá Rafael,

isso está acontecendo pois classe ContaEstudante está com 2 ManipuladorDeSaldo. Na própria classe ContaEstudante tem o atributo manipuladorEstudante e, como ela é filha de ContaComum, também herda o atributo manipulador.

Aí onde ocorre o problema, pois no Main quando se cria a conta de estudante, a chamada para o método Deposita da ContaEstudante faz com que o manipuladorEstudante ganhe o valor depositado.

public override void Deposita(double valor)
{
            this.manipuladorEstudante.Deposita(valor);
            this.Milhas += (int)valor;
}

Porém, a chamada para o método somaInvestimento() de ContaComum atualiza o valor do manipulador, que de fato está zerado:

public void somaInvestimento()
{
            this.manipulador.SomaInvestimento(1.1);
}

Dado que a classe mãe já tem um manipulador, a filha precisaria usar o mesmo para não ocorrer este problema

Entendi, obrigado. Só para constar. - Removi o ManipuladorDeSaldo da ContaEstudante, e do método Deposita da classe. - Criei uma propriedade na ContaComum com a TaxaDeInvestimento (regra passada nas aulas). - Alterei o construtor da classe ContaEstudante para setar a taxa referente a esse tipo de conta. - Alterei a variável de SomaInvestimento para essa TaxaDeInvestimento na ContaComum.