"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Usando uma referência de superclasse para um objeto de subclasse

Usando uma referência de superclasse para um objeto de subclasse

Publicado em 19/11/2024
Navegar:847

Using a Superclass Reference for a Subclass Object

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:

  1. getNomeUsuário()
  2. getUserSalary().

enquanto a classe Employee tem um método adicional chamado getEmployeeInformation() e substitui o método getUserSalary().

Então com User user = new Employee();:

  1. user.getUserName() funcionará, conforme definido na classe User.

  2. 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.

  3. 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.


Upcasting VS. Downcasting

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! :)

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/khaledsalshibani/using-a-superclass-reference-for-a-subclass-object-22ga?1 Se houver alguma violação, entre em contato com [email protected] para excluir isto
Tutorial mais recente Mais>

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