2
respostas

Dúvida sobre limitações do polimorfismo

Olá, na aulas sobre polimorfismo vimos um exemplo onde um objeto declarado como sendo da classe pai instancia um objeto da classe filho

Funcionario f = new Gerente();

Vimos como vantagem dessa abordagem podermos passar qualquer objeto que instancie uma classe filha de "Funcionário" em uma função que receba Funcionário como parâmetro. Entretanto, pelo que eu entendi, dessa forma não conseguimos acessar métodos que sejam exclusivos da classe filha através dessa instância de "f" por exemplo. Isso ficou meio confuso pra mim, uma vez que me parece uma limitação... Qual seria a vantagem de se declarar as coisas dessa forma, se perdemos acesso aos métodos exclusivos da classe filha? O que eu entendi de errado?

2 respostas
public class Veiculo {
    public void liga() {
        System.out.println("Ligando Veiculo");
    }
}
class Carro extends Veiculo {
    public void liga() {
        System.out.println("Ligando Carro");
    }
}
class Moto extends Veiculo {
    public void liga() {
        System.out.println("Ligando Moto");
    }
}
public class Teste {

    public static void main(String[] args) {

        Veiculo m = new Moto();
        m.liga();

        Veiculo c = new Carro(); 
        c.liga();
    } 

}

Esse exemplo as classe filhas sobrescrevem os métodos da classe mãe, se houver mais métodos especificos serão das classes filhas.

Funcionario f = new Gerente();

Funcionario f f é a referência de Funcionário gerente herda da classe genérica funcionário, a classe Gerente é uma classe especializada e funcionário é uma classe genérica, se caso vc quisesse acessar metódos que só existe em Gerente teria que instanciar a classe Gerente.

Vi que vc comentou:

Entretanto, pelo que eu entendi, dessa forma não conseguimos acessar métodos que sejam exclusivos da classe filha através dessa instância de "f" por exemplo

futuramente, vc verá uma coisa chamada responsabilidade única, em outras palavras, cada um no seu quadrado, isso é para diminuir o acoplamento, se houver muitas dependencias, haverá dificuldade em manutenção do código.

mas o intuito da heraça é hedar da classe pai, de baixo para cima, não tem sentindo vc acessar da classe mãe para classe filha, mesmo pq a classe mãe sempre será mais generico.

espero ter ajudado.

Vamos por uma pespectiva diferente? Todo Gerente é funcionário mas nem todo funcionário é gerente, então realmente não podemos instanciar um gerente de uma variavel do tipo Funcionário, justamente pq Gerente tem comportamentos (métodos) diferentes mas continua (extends) sendo Funcionário. Espero ter ajudado!