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

Não entendi...

Fiquei meio perdida com esse ultimo exercício. O instrutor na primeira aula sobre Polimorfismo deu o seguinte exemplo para instanciar um objeto :

Funcionario g = new Gerente(),

sendo a classe Funcionario a super classe e a classe Gerente uma sub classe, porém, ao tentar chamar um método da classe Gerente

g.setNome(); // por exemplo

o eclipse não compilava, aliás, nem encontrava os métodos da classe Gerente.

No exercício , todos os objetos foram criados referenciando a super classe Veiculo, seguindo a logica do exemplo anterior, apenas seria encontrado o método da super classe, sendo assim seria impresso na tela "Ligando Veiculo" nos dois casos, pois para que não fosse assim os objetos teriam que ser instanciados assim:

Moto m = new Moto();
Carro c = New Carro();

Alguém saberia "debugar" o conceito para eu entender qual parte eu perdi???

Obrigada!!!!

3 respostas
solução!

Oi Ingrid, tudo bem?

Eu testei aqui, mas no primeiro exemplo, o método setNome() não seria da classe Funcionário?

As classes Funcionario e Gerente devem estar assim:

Funcionario:

public class Funcionario {

    private String nome;
    private String cpf;
    private double salario;

    public double getBonificacao() {
        return this.salario * 0.5;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getCpf() {
        return cpf;
    }
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    public double getSalario() {
        return salario;
    }
    public void setSalario(double salario) {
        this.salario = salario;
    }
}

Gerente:

public class Gerente extends Funcionario {

    private int senha;

    public void setSenha(int senha) {
        this.senha = senha;
    }
    public boolean autentica(int senha) {
        if(this.senha == senha) {
            return true;
        } else {
            return false;
        }
    }
    public double getBonificacao() {
        return super.getBonificacao() + super.getSalario(); 
    }
}

O que não deve funcionar nesse caso é usar um método próprio da classe Gerente sendo que o tipo da referência g é Funcionario. Como por exemplo o g.autentica ou g.getBonificacao, já que elas só estão presentes na subclasse Gerente e, portanto, fora do escopo do super classe Funcionario.

Agora, no exercício Qual é a saída?, o que acontece é que a super classe Veiculo tem o método liga() dentro dele, dessa forma suas subclasses Moto e Carro não só herdaram esse método como também alteraram o funcionamento dele através da Sobrescrita. A partir daí é só lembrar que sempre é o método mais específico a ser chamado. Em outras palavras, o exemplo dado na primeira aula só não funcionou porque o método autentica() foi chamado sendo que ele não existe na super classe Funcionario, diferente do liga() que, esse sim, está presente no Veiculo.

Espero não ter dado uma explicação muito confusa, se ficou alguma dúvida é só avisar. Bons estudos!

Oi Thiago!!!! Muito obrigada pela sua resposta. Me esclareceu muitoooooo! Que alivio!

Perfeito, Ingrid! Qualquer coisa estamos à disposição, bons estudos! :)