4
respostas

Classes Abstratas - Explicação - Código sugerido pelo diagrama não compila, pq?

Bom dia!

Tentei implementar o código a partir do diagrama que se encontra na explicação dos métodos abstratos.

No texto, o instrutor afirma que o código compilará caso a classe Secretaria seja declarada como abstrata e suas classes filhas (SecretariaAgencia e SecretariaAdministrativa) declarem o método getBonificação() da classe-mãe Funcionário.

No entanto, ao tentar compilar, recebemos o erro:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method setSalario(double) is undefined for the type SecretariaAdministrativa at TestaFuncionario.main(TestaFuncionario.java:30)

Alguém poderia me esclarecer melhor? Certamente estou interpretando o texto de maneira equivocada.

4 respostas

Fala Rafael, tudo bem ?

Poste aqui como ficou o código pra podermos dar uma olhada.

Obrigado pela atenção!

esclareço que minha dúvida é conceitual, ela reside naquilo que está escrito no último parágrafo da transcrição do vídeo:

Link para o exercicio

"E esse diagrama, no qual incluímos uma classe abstrata Secretaria sem o método getBonificacao, que é estendida por mais duas classes (SecretariaAdministrativa, SecretariaAgencia) que, por sua vez, implementam o método getBonificacao, vai compilar? Vai rodar?"

"De novo, a resposta é sim, pois Secretaria é uma classe abstrata e, por isso, o Java tem certeza de que ninguém vai conseguir instanciá-la e, muito menos, chamar o método getBonificacao dela. Lembrando que, nesse caso, não precisamos nem ao menos escrever o método abstrato getBonificacao na classe Secretaria."

mas vamos lá:

A classe mãe:

public abstract class Funcionario {
    private String nome;
    protected double salario;

    public void setSalario(double salario) {
        this.salario = salario;
    }

    public abstract double getBonus();

    public String getNome() {
        return nome;
    }

}

A classe filha:

public abstract class Secretaria {

}

As classes "netas" :

A classe SecretariaAdministrativa :

public class SecretariaAdministrativa extends Secretaria {

    @Override
    public double getBonus() {
        return this.salario * 0.25;
    }

}

p>A classe SecretariaAdministrativa :

public class SecretariaAgencia extends Secretaria {

    @Override
    public double getBonus() {
        return this.salario * 0.25;
    }
}

Oi Rafael,

Obrigado por compartilhar o código com a gente. Consegui ver o que ocorre.

Vamos lá ...

O problema de compilação em si se dá na relação entre as filhas SecretariaAdministrativa e SecretariaAgencia com sua mãe Secretaria.

Perceba que seguindo o exemplo da explicação sobre o conceito de classes abstratas - "não precisamos nem ao menos escrever o método abstrato getBonificacao na classe Secretaria" - a classe secretária fica vazia. Por sua vez, cada uma das classes filhas possui uma sobrescrita do método getBonus(), sinalizada em compilação pela annotation @Override.

Até aí nenhuma problema. Deduzimos que o método está sendo herdado indiretamente da classe Funcionario, da qual Secretaria deveria ser filha. "Deveria" porque faltou justamente na classe Secretaria sinalizar a relação de herança com o extends Funcionario. Isso causa todo o problema.

Se Secretaria não é filha de Funcionario e não define nenhum método getBonus() não tem como o compilador compreender as sobrescritas nas classes filhas. Caso os métodos das filhas não estivessem anotados com @Override compilaria sem problemas, pois nesse caso ele acharia que cada método é particular dessas classes.

Espero ter ajudado. Abraço!

Excelente! Muito Obrigado!