Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Erro ao calcular o total de tributos

O problema é o seguinte: minhas contas poupanças e investimentos foram declaradas como variáveis do tipo Conta, e não como variáveis do tipo ContaPoupança e ContaInvestimento. Isso porque eu usei arrays para fazer a criação de todo tipo de conta, segue o código do Form1:

 public partial class Form1 : Form
    {
        private Conta[] contas = new Conta[3];
        private Cliente[] clientes = new Cliente[3];

       // outras classes estão aqui

        private void button1_Click(object sender, EventArgs e)
        {


            contas[0] = new ContaCorrente();
            clientes[0] = new Cliente("Igor Telles", 16);
            contas[0].Titular = clientes[0];

            contas[0].deposita(2000.0); //saldo inicial

            contas[1] = new ContaPoupança();     
            clientes[1] = new Cliente("Igor Telles", 16);
            contas[1].Titular = clientes[1];

            contas[1].deposita(1500.0);
            contas[1].saca(1);

            contas[2] = new ContaInvestimento();
            clientes[2] = new Cliente("Igor Telles" , 16);
            contas[2].Titular = clientes[2];

            contas[2].deposita(3000.)


            TotalizadorDeTributos tt = new TotalizadorDeTributos(); // Aqui começa o problema.

            tt.Acumula(contas[1]); // o erro exibido é referente ao que está nos parênteses. 


            MessageBox.Show("total de tributos: " + tt.Total);


        }
    }

O erro é " Error CS1503 Argument 1: cannot convert from 'CaixaEletronico2.Conta' to 'CaixaEletronico2.ITributável'".

Pelo o que eu entendi, esse erro acontece pois as contas contas[1] e contas[2] são do tipo Conta, e essa classe não está associada a interface ITributável, pois se eu fizer assim:

ContaPoupança cp1 = new ContaPoupança();
//ou
ContaInvestimento ci1 = new ContaInvestimento();

o erro não acontece.

Meu ponto é o seguinte: Há algum jeito de resolver o meu problema sem que eu tenha que deixar de usar os arrays pra criar contas? Pois se não houver significa que nem sempre o polimorfismo funciona, e que eu vou ter que escrever muito mais.

11 respostas

ContaInvestimento herda de Conta ?

Se não herdar não irá dar certo o polimorfismo nessa situação.

Sim, todas as classes conta herdam da Conta

Sua classe conta deve implementar a interface ITributavel. Assim, todas as suas classes filhas necessariamente a implementarão também.

Mas aí eu tenho 3 classes filhas de Conta: ContaPoupança, ContaInvestimento e ContaCorrente. Eu quero que apenas as duas primeiras estejam associadas a interface ITributavel. Fazendo isso a ContaCorrente não seria obrigatoriamente associada à interface?

solução!

Ops. Pensei que essa fosse sua intenção... Já que não é, fazer o cast seria a solução.

tt.Acumula(((ITributavel) contas[1]));

Valeu, Carlos, funcionou! Mas eu não entendi muito bem a lógica dessa operação de casting. Devo abrir outro tópico ou você pode me ajudar nesse mesmo?

Igor, quando você faz o cast de alguma variável, ela passa a ser vista com aquele novo tipo, embora nenhuma operação seja realizada em seu valor. Então, sua conta passou a ser vista como uma variável do tipo ITributavel que era o esperado pelo método que a recebia. Se continuar com duvida, pode perguntar que eu tento coloca de outra forma.

Espero ter ajudado.

Obrigado, entendi! Desculpa estar abusando, mas mais uma coisa. Eu não entendi mt bem a organização do codigo. Por que tem tanto parênteses?

Rsrsrsrs Não precisa se desculpar. Os parênteses mais externos são opcionais. Eu só coloquei pq como to digitando pelo celular, eu visualizei melhor dessa forma. Mas, pode ficar assim:

tt.Acumula((ITributavel) contas[1]);

Entre ITributavel é obrigatório o uso dos parênteses. É a sintaxe de casting mesmo.

Qualquer coisa, pode perguntar. Rsrsrs

Aaah, agora eu entendi! Muito obrigado mesmo!

Por nada, Igor. Se precisar, só falar. :-D