Autor Tema: Ejemplo polimorfismo Java, sobreescritura de métodos CU00691B Ejercicio resuelto  (Leído 3726 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes, dejo mi solución del ejercicio (archivo adjunto, pulsar en el icono para descargar estando logados en el foro),  hay solo una flecha que no me cuadraba, la de listinProfesores que no usaba ProfesorInterino y yo si, es debido a que yo llamo a (temp instanceof ProfesorInterino) para distinguir los unos de los otros.

Pero hay algo que me ha descolocado un poco, y quizá ahora mismo estoy espeso, si alguien me arroja un poco de luz;

si un objeto inicialmente declarado como Profesor, en un momento dado tiene un ProfesorInterino y llamas a su método mostrarDatos(), ejecuta el mostrar datos de ProfesorInterino, sin necesidad de casting, yo creia que era ahí donde habia que hacer un cast necesariamente.

(si lo haces no da error pero el resultado es el mismo en ejecucion aparentemente al menos)

Con Iterator pasaria exactamente igual? o habría que hacer un cast al ser una copia del array.
« Última modificación: 22 de Abril 2015, 10:36 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Hola, en la entrega CU00690B creo que hay un texto relacionado con la duda

Citar
El tipo del objeto al que apunta la variable en un momento dado (en tiempo de ejecución): puede ser el tipo declarado o un subtipo del tipo declarado, y se llama tipo dinámico.

El compilador controla los tipos basándose en el tipo estático (declarado) ... Como veremos a continuación, esto es una limitación relativa, porque en los métodos que denominamos “sobreescritos” sí se llega a identificar si un método corresponde a un supertipo o a un subtipo.

Decimos que un método está sobreescrito cuando está presente, exactamente con la misma signatura, en una subclase y en una superclase.

Si como hemos dicho, el compilador se basa en el tipo estático para su trabajo, podríamos pensar que si invocamos a un objeto de tipo estático “superclase” y tipo dinámico “subclase” con un método sobreescrito, el método que se utilice sería el propio de la superclase. Pero sin embargo, esto no es así: el control de tipos del compilador se basa en los tipos estáticos pero en tiempo de ejecución los métodos que se ejecutan dan preferencia al tipo dinámico. Es decir, en tiempo de ejecución Java está constantemente “buscando” (“ligando” o “despachando”) el método que corresponda en función del tipo dinámico

El casting es un poco complejo, de hecho muchos programadores lo van haciendo a medida que ven que les saltan errores. En este caso ProfesorInterino tiene un método mostrarDatos que también tiene Profesor. Cuando llamas al método primero se busca en el tipo dinámico, en este ejemplo la subclase, y no es necesario el casting si en ese momento el tipo dinámico dispone de ese método o es capaz de alcanzarlo.

Lo del Iterator no he entendido muy bien a qué te referías

Salu2

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas Ogramar,


Vale, genial ese apunte, entonces entiendo que los metodos sobreescritos, van distinto del resto, y no es necesario un casting, porque ya java busca el que corresponde a la subclase.

Y sobre lo de Iterator, me explico (a veces tienes las cosas en la cabeza y las presupones sin explicarlas, craso error)

En lugar de un for each, se podria recorrer el ArrayList con un Iterator;

Iterator iter = ArrayList.iterator();

while (iterator.hasNext()) { imprime }

En este caso, al ser una copia de los Profesores del ArrayList, esta copia los cogeria con su objeto estatico declarado o con el objeto que tuvieran en el momento de hacer el .iterator().

En ese momento si se tendría que hacer un cast para pasarlo (no se si me explico bien en la duda :) )


Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Hola siempre que hagas un bucle el bucle mostrará lo que tenga el objeto en ese momento (dinámico). A la hora de elegir el tipo para el iterator hay que ver el tipo que se debe asignar para cada caso concreto, otra opción es dejar el Iterator sin especificar el tipo para que sea el compilador de java quien resuelva el tipo. Esto es difícil de hablar sin ejemplos concretos pues hay que ver cada caso.

Salu2

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Bueno más o menos me hago una idea y me has ayudado mucho en tus aclaraciones Ogramar, gracias como siempre por la paciencia con los duros de moyera como yo ;)

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".