Considere um cenário onde criamos uma classe chamada User e então criamos uma subclasse que estende User chamada Employee.
Normalmente, criamos uma instância de User com:
User user = new User();
Aqui User é o tipo da variável user, user é a variável que contém a instância da classe e new User() cria uma nova instância de User.
Simplificando, o usuário é uma instância de User.
Mas e se a superclasse User precisar usar métodos definidos em sua subclasse Employee? Isso pode acontecer?
A resposta curta é sim, mas apenas para métodos substituídos (métodos que existem tanto na superclasse quanto na subclasse). É isso que permite o polimorfismo.
Como o relacionamento na herança é "é-um" relacionamento, Employee is-a User. portanto, nada impede que User mantenha uma referência a uma instância de sua subclasse Employee, desde que seja um tipo compatível.
Isso é feito da seguinte maneira:
User user = new Employee();
Agora, digamos que a classe User tenha dois métodos:
enquanto a classe Employee tem um método adicional chamado getEmployeeInformation() e substitui o método getUserSalary().
Então com User user = new Employee();:
user.getUserName() funcionará, conforme definido na classe User.
user.getUserSalary() também funcionará, mas a saída será do método getUserSalary() substituído na classe Employee, não daquele em User . Esta é a essência do polimorfismo.
user.getEmployeeInformation() não funcionará. Isso gerará um erro de compilação, pois é específico da classe Employee.
Um erro de compilação ocorre quando o compilador encontra problemas como erros de sintaxe, incompatibilidades de tipo ou outras violações que impedem a compilação de código bem-sucedida.
Se tentarmos fazer o inverso e referenciar um objeto da subclasse Employee com uma referência de superclasse User, não funcionará sem a conversão manual! Isso requer casting explícito, já que Usuário não é necessariamente um Funcionário.
Depois de explicar isso de forma simples, com um exemplo simples, vamos nos concentrar nos termos.
"Referência de superclasse para objeto de subclasse" normalmente é chamada de upcasting. Simplificando, upcasting é a conversão de tipo de um objeto filho para um objeto pai, e isso acontece implicitamente (significando que o compilador lida com isso automaticamente, portanto, não precisamos de nenhuma sintaxe de conversão específica). É como quando fizemos User user = new Employee();.
E quanto ao downcasting?
Downcasting é exatamente o oposto de upcasting.
Lembra quando dissemos que criar uma referência Employee a partir de uma instância de User é inválido? Isso é chamado de downcasting e deve ser feito explicitamente usando a sintaxe de conversão. Embora o upcasting seja muito seguro, o downcasting causa riscos. Isso não significa que não seja útil, mas deve ser usado com cautela.
Não entrarei em muitos detalhes sobre downcasting, pois este artigo é focado em upcasting, mas o ponto principal é mostrar a principal diferença entre downcasting e upcasting.
E pronto! :)
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3