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

Exercicio 2 Interfaces - Curso Java

Olá, estou tentando atribuir um objeto de uma sub-classe a uma variável do tipo interface, de acordo com o sugerido no exercício 2 de interfaces do curso de java, o Eclipse sugere que eu implemente a classe mãe a interface, porem com isso meus metodos da interface serão todos obrigatórios inclusive para as classes que não são implementadas pela interface. Será que eu estou equivocando em algum ponto do meu codigo? algem poderia dar uma revisada no meu codigo?

Classe Mãe:

abstract class Conta {

    protected double saldo;


    public void deposita(double valor) {
        this.saldo = this.saldo + valor;
    }

    public double getSaldo() {
        return this.saldo;
    }

    abstract void atualiza(double taxa);

    public void saca(double valor) {
        if (this.saldo > valor) {
            this.saldo = this.saldo - valor;
        } else {
            System.out.println("Saldo Insuficiente");
        }
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

}

Sub Classe

public class ContaCorrente extends Conta implements Tributavel {

    @Override
    void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 2;
    }

    @Override
    public double calculaTributo() {
        return this.saldo * 0.1;
    }

}

Sub Classe

public class ContaPoupanca extends Conta {

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 3;

    }

    public void deposita(double valor) {
        this.saldo += valor - 0.10;

    }

    @Override
    public double calculaTributo() {
        // TODO Auto-generated method stub
        return 0;
    }

}

Interface:


public interface Tributavel {

    double calculaTributo();

}

Classe de teste

public class Principal {

    public static void main(String[] args) {

        Conta cc = new ContaCorrente();
        Conta cp = new ContaPoupanca();

        Tributavel t = cc;

        AtualizadorDeContas pedro = new AtualizadorDeContas(0.01);

        cc.deposita(1000.0);
        cp.deposita(1000.0);

        System.out.println("Geral");
        pedro.roda(cc);
        System.out.println("Conta Corrente");
        pedro.roda(cp);
        System.out.println("Conta Poupança");

        System.out.println("Saldo Total   : R$" + pedro.getSaldoTotal());

        System.out.println("Tributos: " + t.calculaTributo());


    }

}

O erro acontece na linha:

Tributavel t = cc;
2 respostas
solução!

O erro está no fato de interfaces não podem ser tipos para atributos. Uma maneira de explicar isso é por exemplo:

Pessoa, uma classe, possui um gato, o atributo gato que diz qual raça e talz. O gato implementa a interface "comPelos" ou "peludo".

O que eu quero dizer é que interface se aplica a classes assim como adjetivos se aplica a substantivos. Logo não é possível esperar que uma declaração através de uma interface. Voltando ao exemplo:

Se uma pessoa tem um "peludo", você não sabe se é um gato ou cão. Logo isso gera um erro.

Porem em uma função "tosar", posso receber tanto gato quanto cão logo posso esperar pela interface peludo no parâmetro de entrada.

Espero não ter confundido ainda mais.

José o que acontece é que uma interface não pode ser instanciada. Interface é a maneira através da qual conversamos com um objeto. Nesse exemplo a contacorrente conversa com a tributavel. Ela só expõe o que o objeto deve fazer, e não como ele faz, nem o que ele tem. Como ele faz vai ser definido em uma implementação dessa interface, a contacorrente.