"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Usar una referencia de superclase para un objeto de subclase

Usar una referencia de superclase para un objeto de subclase

Publicado el 2024-11-19
Navegar:397

Using a Superclass Reference for a Subclass Object

Considere un escenario en el que creamos una clase llamada Usuario y luego creamos una subclase que extiende el Usuario llamada Empleado.
Normalmente, creamos una instancia de Usuario con:

User user = new User();

Aquí Usuario es el tipo de variable usuario, usuario es la variable que contiene la instancia de la clase y nuevo Usuario() crea una nueva instancia de Usuario.
En pocas palabras, el usuario es una instancia de Usuario.


Pero ¿qué pasa si la superclase Usuario necesita usar métodos definidos en su subclase Empleado? ¿Puede suceder esto?
La respuesta corta es , pero sólo para métodos anulados (métodos que existen tanto en la superclase como en la subclase). Esto es lo que permite el polimorfismo.
Dado que la relación en herencia es "es-una" relación, Empleado es-un Usuario. entonces, nada impide que Usuario mantenga una referencia a una instancia de su subclase Empleado, siempre que sea un tipo compatible.

Esto se hace de la siguiente manera:

User user = new Employee();

Ahora, digamos que la clase Usuario tiene dos métodos:

  1. obtenerNombre de usuario()
  2. getUserSalary().

mientras que la clase Empleado tiene un método adicional llamado getEmployeeInformation() y anula el método getUserSalary().

Luego con Usuario usuario = nuevo Empleado();:

  1. user.getUserName() funcionará, tal como se define en la clase Usuario.

  2. user.getUserSalary() también funcionará, pero la salida será del método getUserSalary() anulado en la clase Employee, no del de User . Ésta es la esencia del polimorfismo.

  3. user.getEmployeeInformation() no funcionará. Generará un error de compilación ya que es específico de la clase Empleado.

Se produce un error de compilación cuando el compilador encuentra problemas como errores de sintaxis, discrepancias de tipos u otras violaciones que impiden la compilación exitosa del código.

Si intentamos hacer lo contrario y hacer referencia a un objeto de subclase Empleado con una referencia de superclase Usuario, ¡no funcionará sin conversión manual! Esto requiere una conversión explícita, ya que Usuario no es necesariamente un Empleado.


Upcasting VS. abatido

Después de explicar esto de forma sencilla, con un ejemplo sencillo, centrémonos en los términos.

"Referencia de superclase a objeto de subclase" normalmente se denomina upcasting. En pocas palabras, la conversión ascendente consiste en encasillar un objeto secundario en un objeto principal, y ocurre implícitamente (lo que significa que el compilador lo maneja automáticamente, por lo que no necesitamos ninguna sintaxis de conversión específica). Es como cuando hicimos Usuario usuario = nuevo Empleado();.

¿Qué pasa con el downcasting?

Downcasting es exactamente lo opuesto a upcasting.

¿Recuerdas cuando dijimos que crear una referencia de Empleado a partir de una instancia de Usuario no es válido? Esto se llama downcasting y debe hacerse explícitamente utilizando la sintaxis de conversión. Si bien el upcasting es muy seguro, downcasting conlleva riesgos. Esto no significa que no sea útil, pero debe usarse con precaución.

No entraré en demasiados detalles sobre el downcasting ya que este artículo se centra en el upcasting, pero el punto clave es mostrar la diferencia principal entre downcasting y upcasting.


¡Y eso es todo! :)

Declaración de liberación Este artículo se reproduce en: https://dev.to/khaledsalshibani/using-a-superclass-reference-for-a-subclass-object-22ga?1 Si hay alguna infracción, comuníquese con [email protected] para eliminar él
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3