9
respuestas

Duda de la clase de Polimorfismo

La duda que tengo es la siguiente:

Por que al ejecutar los resultados de Diego, Jimena y Alexis al mismo tiempo, el resultados de estos sale con mas valor del que deberian tener.

El unico que tiene el resultado correcto es diego, mas jimena y alexis sus resultados son erroneos.

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

Pero si los ejecuto individualmente, sus resultados son correctos.

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidadSi alguien me puede explicar lo agradeceria!

9 respuestas

Hola Andres, como estas? a ver si puedo ayudar con tu duda:

El salario de Diego es 2000. La bonificación de Diego, esta estipulada en la clase Funcionario, y es del 5%, lo que da como resultado = 100.

La clase ControlBonificacion tiene el atributo "suma", el cual se inicializa con el valor 0. Pero tras la primer ejecución del metodo registrarSalario que utiliza la clase TestControlBonificacion para "Diego", el atributo de "suma" cambia su valor de 0 a 100:

public double registrarSalario(Funcionario funcionario) {               --->           //public double registrarSalario(Funcionario diego) {
    this.suma = funcionario.getBonificacion() + this.suma;                --->           //this.suma(0)   = diego.getBonificacion(100) + this.suma(0)
    System.out.println("Calculo actual: " + this.suma);                        --->          //System.out.println("Calculo actual: " + 100);
    return this.suma;                                                                                 --->          //return 100;

El salario de Jimena es de 10000. La bonificación de Jimena esta estipulada en la clase Gerente, el cual es de un salario completo (10000) más otro 5% de su salario (500), lo que da como resultado = 10500.

Cuando volvemos a consultar "controlBonificacion.registrarSalario(jimena); volvemos a ejecutar el metodo "registrarSalario":

public double registrarSalario(Funcionario funcionario) {                 --->          //public double registrarSalario(Gerente Jimena) {
    this.suma = funcionario.getBonificacion() + this.suma;                  --->          //this.suma(100)   = jimena.getBonificacion(10500) + this.suma(100)
    System.out.println("Calculo actual: " + this.suma);                          --->          //System.out.println("Calculo actual: " + 10600);
    return this.suma;                                                                                   --->          //return 10600;

Tras la segunda ejecución del metodo registrarSalario que utiliza la clase TestControlBonificacion para "Jimena", el atributo de "suma" cambia su valor de 100 a 10600.

Por ultimo, la bonificación de Alexiz esta estipulada en la clase Contador, y solo retorna 200. Por lo que al consultar por ultima vez "controlBonificacion.registrarSalario(alexiz);", esto vuelve a utilizar el metodo "registrarSalario":

public double registrarSalario(Funcionario funcionario) {                  --->          //public double registrarSalario(Contador alexiz) {
    this.suma = funcionario.getBonificacion() + this.suma;                   --->          //this.suma(10600)   = alexiz.getBonificacion(200) + this.suma(10600)
    System.out.println("Calculo actual: " + this.suma);                           --->          //System.out.println("Calculo actual: " + 10800);
    return this.suma;                                                                                    --->          //return 10800;

Al valor del atributo "suma" que estaba en 10600 ahora se le suman los 200 del contador, por lo que el método termina retornando el valor 10800.

Espero haberme explicado bien. Las ideas estan en la cabeza pero al momento de pasarlas por escrito se vuelve complicado de plasmar. Ojala te sea de ayuda para salvar tu duda. Cualquier cosa no dudes en volver a consultar. Saludos.

Que tal Oscar una pregunta. No entendi cuando el instructor Diego dijo que se manda a llamar al metodo mas especifico. El nos dice lo siguiente:

[03:34] Si getBonificacion ya está en la clase Gerente, entonces él va a llamar al método de la clase Gerente, no va a llamar al método de la clase padre. Igual caso con el contador. Si él encuentra este método aquí, sobreescrito, entonces él va a llamar a este método de aquí, no va a llamar al método de la clase Funcionario. ¿Cómo se dieron cuenta que fue anteriormente que el contador tenía la misma bonificación del funcionario?

[04:05] Y como yo siempre digo, no basta solamente con creer. Vamos a probarlo. Entonces vamos a darle aquí un syso. Perfecto. Se fue. Ya. Y aquí le vamos a decir que nos indique nada más, ejecutando desde Gerente. Perfecto. "Ctrl + S" y la misma cosa aquí. A ver. Syso, comillas y ejecutando desde contador. Perfecto. Entonces, esto se va a imprimir si y solo si él está llamando estos métodos de las clases más específicas.

Yo lo entiendo de esta forma: Calculo actual: 100.0 fue ejecutado por Funcionario porque fue el primero en la orden de impresion que hicimos

EJECUTANDO DESDE GERENTE Calculo actual: 10600.0 Jimena gana 10000 * 0.05 = 500 + 10,000 = 10,500 + 100 (que es la bonificacion de Funcionario ejecutado por Funcionario por eso nos dan 10600, y asi sucesivamente pero no se si estoy bien, muchas gracias

Hola Edgar, como estas?

En el contexto que mencionas, el instructor Diego está hablando sobre la sobrescritura de métodos en Java. Cuando una clase hereda de otra clase y ambas tienen un método con el mismo nombre, es posible que el método específico de la clase hija (subclase) se ejecute en lugar del método de la clase padre (superclase).

En el caso específico que mencionas, si el método getBonificacion está presente tanto en la clase Gerente como en la clase Funcionario, y estás llamando a ese método en un objeto de la clase Gerente, el método que se ejecutará será el de la clase Gerente. Esto se debe a que Java prioriza la ejecución del método más específico, es decir, el método definido en la clase hija.

La misma lógica se aplica al método getBonificacion en la clase Contador. Si existe una implementación específica de ese método en la clase Contador, se ejecutará esa implementación en lugar del método de la clase Funcionario (superclase).

En cuanto a tu ejemplo específico, si el objeto es de tipo Gerente y se llama al método getBonificacion, se ejecutará la implementación específica de la clase Gerente, que incluirá el cálculo de bonificación adicional para los gerentes. De manera similar, si el objeto es de tipo Contador y se llama al método getBonificacion, se ejecutará la implementación específica de la clase Contador.

Entonces, en resumen, cuando se llama a un método que está sobrescrito en una subclase, Java ejecuta la implementación específica de la subclase en lugar de la implementación de la superclase. Esto permite personalizar y extender el comportamiento de los métodos en las clases hijas.

Espero que esta explicación te sirva de ayuda. Cualquier cosa no dudes en volver a consultar. Saludos

Ahora ya lo entiendo mucho mejor, muchas gracias Oscar, saludos.

gracias Oscar ptra molestia, creo que movi algo pero no se que fue, en las captura de pantalla te muestro. El resultado ya fue otro y segun creo tener todo bien, gracias.

EJECUTANDO DESDE CONTADOR Calculo actual: 200.0 EJECUTANDO DESDE GERENTE Calculo actual: 10700.0 EJECUTANDO DESDE CONTADOR Calculo actual: 10900.0

Oscar ptra molestia, creo que movi algo pero no se que fue, en las captura de pantalla te muestro. El resultado ya fue otro y segun creo tener todo bien, gracias.

No te preocupes Edgar, seguramente al avanzar con los cursos se han ido modificando los valores de las bonificaciones al seguir los videos y por eso los calculos dan diferente. Pero el codigo responde bien.

Si, el codigo eta bien, mil gracias.

Muy buenos días. Tengo una pregunta, en la Clase Contador no se especificó el valor de la bonificación, por tanto se usa el método de la clase genérica Funcionario. Lo que no puedo entender es: ¿por qué el contador tiene la misma bonificación del gerente mas los 200 que son constantes?. Si Alexis tiene un salario de 5000 su bonificación debe ser de 250, o no?