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)

Saldo para o Estudante sendo exibido como 0(zero)

Quando fiz as alterações conforme mostrado na ultima aula do curso, o ultimo saldo que é exibido está zerado.

Percebi que quando a classe estudante é estanciada, existem duas estancias da Classe ManipuladorDeSaldo, e quando chamamos o SomaInvestimentos, a classe ManipuladorDeSaldo, é utilizado para a soma do objeto gerado pela classe ContaComum e não pela ContaEstudante. Por isso o saldo está zerado para a ContaEstudante.

Não entendi como consultar o saldo do estudante para printar na tela no metodo main().

Quando inspeciono o objeto contas, na classe ProcessadorDeInvestimentos, o ultimo objeto(do ContaEstudante) possui duas instancias do ManipuladorDeInvestimento, uma correta com o saldo que adicionei e outra com o saldo zerado. Não entendi como resolver isso.

Main:

public class 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(100));
        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;
    }
}

}

Conta Comum:

public class ContaComum
{
    private ManipuladorDeSaldo manipulador;
    public ContaComum()
    {
        this.manipulador = new ManipuladorDeSaldo();
    }
    public void SomaInvestimento()
    {
        this.manipulador.SomaInvestimento(1.1);
    }
    public void Saca(double valor)
    {
        manipulador.Saca(valor);
    }
    public void Deposita(double valor)
    {
        manipulador.Deposita(valor);
    }
    public double Saldo()
    {
        return manipulador.Saldo;
    }
}

ContaEstudante:

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

    public ContaEstudante()
    {
        m = new ManipuladorDeSaldo();
    }
    public void Deposita(double valor)
    {
        m.Deposita(valor);
        this.Milhas += (int)valor;
    }
}

Manipulador de Saldo:

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;
    }
}
5 respostas
solução

Olá Tchelas!

Parece que você está tendo um pouco de dificuldade com a herança nas classes ContaEstudante e ContaComum.

Veja que você criou um objeto comum em ambas as classes, o ManipuladorDeSaldo, porém como na classe ContaComum ele está private, você não consegue acessar na ContaEstudante.

Eis uma solução, utilizando a herança:

public class ContaComum
{
    //Alterar a variável manipulador para protected, ainda será oculto para acesso externo, porém a classe ContaEstudante poderá acessar.
    protected ManipuladorDeSaldo manipulador;
    .
    .
    .
}

public class ContaEstudante : ContaComum
{
    //Aqui, pode remover o manipulador de saldo, ajuste as referências para utilizar o manipulador.
    //private ManipuladorDeSaldo m;
    public int Milhas { get; private set; }

    //Adicione uma chamada ao construtor da classe pai
    public ContaEstudante() : base()
    {
        //Também não precisa instanciar novamente o manipulador.
        //m = new ManipuladorDeSaldo();
    }
    .
    .
    .
}

Dessa forma ao utilizar a classe ContaEstudante, ela estará utilizando a mesma instância do ManipuladorDeSaldo que a classe base.

Espero ter ajudado, se ainda tiver alguma dúvida não hesite em perguntar!

Zambon.

Zambon, era isso mesmo. Como eu copiei fielmente o código da aula estava gerando este problema. Como ele dava um new no manipuladorDeSaldo dentro da classe ContaEstudante acabavam ficando duas instancias do manipulador.

Uma dúvida:

Eu deixei o construtor da estudante vazio e utilizei a variável "manipulador" da que é declarada apenas na classe pai.

E aí funcionou Ok. Consegue enxergar se isso me geraria algum problema futuro?

O Código ficou assim:

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

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

Esse código na Main é que cria instancia da Conta Estudante:

        ContaEstudante conta = new ContaEstudante();
        conta.Deposita(saldo);

Olá Tchelas!

É isso mesmo, creio que não teria problemas dessa forma, pois as suas classes que herdam de ContaComum conseguem utilizar o manipulador, pelo que entendi creio que essa seria a forma mais correta.

Pensando num sistema bancário, poderiam existir outros tipos de classes que também fariam a herança de ContaComum, como ContaEmpresa, ContaPessoal, etc. e que dessa forma também conseguiriam acessar o manipulador.

Apenas acrescente uma chamada ao construtor da ContaComum no construtor da sua classe filha, dessa forma você garante que ao construir a ContaEstudante seja instanciado o manipulador:

    public ContaEstudante() : base() //Mesmo que este manipulador esteja vazio, faça a chamada ao manipulador da classe base.
    {

    }

Abraços!

Zambon.

Olá Tchelas! Tudo bem?

Você conseguiu entender como funciona a herança e tudo mais? Essa parte é um pouco complexa talvez no começo, mas depois com o tempo fica mais tranquilo.

Por favor, só te peço para que se eu respondi a sua dúvida, marca como respondido.

Se ainda tiver alguma dúvida, não hesite, estou aqui para ajudar!

Abraços. Zambon.

Ajudou sim. Valeu! Vou tentar reportar para eles ajustarem o exemplo da aula.

Abraços

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software