Hola alguien me podria explicar este tema por favor,en todos lados encuentro el mismo ejemplo empleado ejecutivo.
Y no encuentro la gracia de disfrazar un objeto de otro objeto,cual es el fin?
No entiendo me confunde mucho este concepto
| |||
[Ayuda]Upcast y downcast Hola alguien me podria explicar este tema por favor,en todos lados encuentro el mismo ejemplo empleado ejecutivo. Y no encuentro la gracia de disfrazar un objeto de otro objeto,cual es el fin? No entiendo me confunde mucho este concepto |
| |||
Respuesta: [Ayuda]Upcast y downcast Muchas gracias me quedo un poco claro no tanto. Pero si se lo que es polimorfismo cuando las clases interpretan un mismo "mensaje" de otra manera. Por ejemplo implemento las interfaces cada clase puede interpretar cada metodo de una manera distinta.
Código Java:
Eso tambien lo vi cuando esta casteo.Ver original Ahi un ejecutivo estaria "disfrazado" de empleado pero tiene ambos metodos de las dos clases? |
| |||
Respuesta: [Ayuda]Upcast y downcast
Código Java:
Ver original Esas parte de codigo me confunden |
| ||||
Respuesta: [Ayuda]Upcast y downcast Hola: Cuando haces un new de una clase (Empleado), en memoria tienes una clase Empleado. Puedes guardar esa zona de memoria en una variable de tipo Empleado o en una variable cuyo tipo sea padre de Empleado. Es decir, estas dos cosas, si Persona es padre de Empleado, son válidas Persona p = new Empleado(); Empleado e = new Empleado(); El problema de guardar un Empleado en una variable de tipo Persona, es que en memoria sigues tieniendo un Empleado, pero no puedes acceder a los métodos propios de Empleado que no tiene Persona. Si Empleado tiene un método unMetodo() que no tiene Persona, no puedes llamarlo de ninguna manera, ya que p.unMetodo() te protestará en compilado. Como p tiene realmente en memoria un Empleado, la forma de recuperarlo para poder usar todos sus métodos, es hacer el "cast" que has hecho Empleado e = (Empleado) p; ¿Por qué guardar un Empleado en una variable de tipo Persona?. Porque puedes hacer un método que trate con Persona, llamando por ejemplo a su método getNombre(), estilo este
Código Java:
Ver original y podrías llamar a este método con una Persona, con un Empleado o incluso con una clase que todavía no existe y que hagas más adelante que sea hija de Persona. También, como dice Xerelo, puedes hacer una lista de Personas y meter ahí Empleados, Personas o lo que quieras, mezclados. Se bueno. |
| |||
Respuesta: [Ayuda]Upcast y downcast Pero cual es la ventaja del cast? porque si quiero metodos de clase empleado creo que objeto tipo empleado asi
Código Java:
Ver original No entiendo la ventaja de usar cast si quiero usar metodos de empleado creo un objeto de tipo empleado y si quiero un objeto de tipo Persona creo un objeto de tipo Persona no entiendo para que se mezclan esta linea por ejemplo
Código Java:
Ver original Ahi tengo un objeto de tipo Empleado que tiene los metodos de persona,no?Cual es la ventaja de hacer eso me cuesta mucho entender |
| ||||
Respuesta: [Ayuda]Upcast y downcast Hola: No es habitual hacerlo de forma tan directa, como bien dices, si quieres un empleado, lo guardas en una variable empleado y listo. Lo mas habitual suele ser tener un "almacen" de Persona en el que metes, mezclados, cosas como Empleado, Supervisor, Jefe, Director, etc, todos ellos que heredan de Persona. LinkedList<Persona>lista = new LinkedList<>(); lista.add(new Empleado()); lista.add(new Persona()); lista.add(new Director()); ... cuando recorres esa lista y necesitas métodos que todos tienen porque heredas de Persona, no hace falta nada especial.
Código Java:
Ver original Pero imagina que te piden que escribas el sueldo de los empleados y getSueldo() solo lo tienen los empleados. No te queda mas que hacer algo como esto
Código Java:
Ver original como ves, se tiene un empleado guardado en una variable de tipo Persona y hay que hacer el cast para poder llamar a getSueld(). Se bueno. |
| |||
Respuesta: [Ayuda]Upcast y downcast Entonces el upcast y el downcast sirven para usar metodos de otras clases,sirve para escribir menos codigo? siempre cuando entre ellas tenga una relacion de herencian en comun. Ese es el fin del casteo? |
| ||||
Respuesta: [Ayuda]Upcast y downcast Hola, Posiblemente Desde mi punto de vista muy personal, el fin del casteo no es tanto un fin sino mas bien un efecto secundario. Hasta el momento en este hilo se mencionado la herencia, pero no se ha mencionado mucho sobre las interfaces, donde yo creo que es mas evidente el concepto. Lo que sucede en ese caso es que es un punto de vista muy simplificado. Lógicamente cuando quieras un nuevo objeto de tipo empleado vas a usar el tipo Empleado para almacenar la referencia. Pero hay momentos donde surge la necesidad de usar este concepto de forma mas compleja. El ejemplo mas simple que se me ocurre es el siguiente, supongamos que tienes una clase con un método para enviar mensajes:
Código Java:
Ver original También supongamos que tienes varios transportes, puede ser por email, por mensaje instantáneo, por mensaje subliminal u otros. El método enviarMensaje anterior se encarga de enviar el mensaje por el método que le indiques por Transporte, así que podrías implementar diferentes Transportes.
Código Java:
Ver original Y posiblemente la forma de usar el downcast es el siguiente ...
Código Java:
Ver original Es decir, estás creando una clase TransporteSubliminal, pero el método enviarMensaje solo le interesa que sea un Transporte, el método lo usa como una clase básica que implementa Transporte, esto te permite que puedas cambiar a TransporteFacebook mas adelante sin modificar el código existente, solamente cambiando TransporteSubliminal() por TransporteFacebook(). Adicionalmente no necesitas un método enviarPorTransporteEmail, enviarPorTransporteSubliminal, etc., y de allí saca tus conclusiones de como te puede ser útil y simple poder cambiar el transporte dependiendo de la configuración o el estado de tu aplicación, etc. Este ejemplo está creado con una interfaz, que puede modificar para que extienda una clase en lugar de una interfaz, para observar todo el efecto claramente. En el caso del upcast el concepto es al contrario, pero no se me ocurre un ejemplo rápidamente en este momento. Saludos, |
| |||
Respuesta: [Ayuda]Upcast y downcast Muchas gracias por tu tiempo primero. Tengo una duda el casteo no va asi "(TipoAcasteear) Objeto que quiero castear" y esta linea no me queda clara son dos metodos seguidos??
Código Java:
Ver original |
| ||||
Respuesta: [Ayuda]Upcast y downcast Hola, Cita: Creo que tendrías que profundizar más en el lenguaje para comprender el concepto y/o la utilidad del downcast en ese caso. En el ejemplo 'transporte' es un parámetro que se envía al método, 'enviar' es un método de la clase o interfaz 'Transporte', que este a su vez recibe un parámetro de tipo Mensaje (aunque el mensaje no es importante en el ejemplo, era simplemente para completar la definición).
Iniciado por tapiadiego335 Muchas gracias por tu tiempo primero. Tengo una duda el casteo no va asi "(TipoAcasteear) Objeto que quiero castear" y esta linea no me queda clara son dos metodos seguidos??
Código Java:
Ver original Es decir, no son dos métodos seguidos, es un método de un objeto de tipo Transporte, siendo este cualquier objeto que hereda o implementa Transporte, dependiendo si es una clase o una interfaz. En el caso que yo expuse no era necesario el cast explicito, porque está implicito en una interfaz.
Código Java:
Ver original Es lo mismo que:
Código Java:
Ver original Saludos, |
| ||||
Respuesta: [Ayuda]Upcast y downcast Cita: Si, pero no exactamente. El polimorfismo permite hacer cosas que no serian posibles (o serian muy muy complicadas) de otra manera.Entonces el upcast y el downcast sirven para usar metodos de otras clases,sirve para escribir menos codigo? siempre cuando entre ellas tenga una relacion de herencian en comun. Ese es el fin del casteo? Te he hecho un ejemplo para que lo estudies que creo que es bastante explicativo:
Código Java:
Ver original
Código Salida Consola:
Ver original Un saludo
__________________ If to err is human, then programmers are the most human of us |
| |||
Respuesta: [Ayuda]Upcast y downcast ah ya entendi "memsaje" y "transporte" son dos parametros pero es lo mismo que hacer esto
Código Java:
Ver original Estaria bien eso? |
| ||||
Respuesta: [Ayuda]Upcast y downcast Hola, Cita: Estaría bien, pero no es lo mismo, en el ejemplo que yo mostré estaría llamando al método enviar() del objeto transporte, en tu ejemplo estarías llamando a un método llamado enviar() que debería estar definido en la misma clase que enviarMensaje, si no existiera ese método el compilador generaría un error.
Iniciado por tapiadiego335 ah ya entendi "memsaje" y "transporte" son dos parametros pero es lo mismo que hacer esto
Código Java:
Ver original Estaria bien eso? Ahora bien, aunque puedo estar equivocado, creo que te hace falta profundizar un poco mas en el lenguaje Java antes de ponerte a pensar en Cast. Es decir, primero pensaste que eran dos métodos seguidos (cosa que no se puede hacer en Java, de la forma como está escrito el ejemplo), ahora piensas que al quitar el objeto transporte estarías llamando al mismo método, y que es lo mismo cuando realmente son dos cosas completamente diferentes. Y en todo eso no hay nada de casteo es puro lenguaje Java, bastante básico por cierto. Es decir, no hemos llegado a la parte complicada (que sería el Cast) y ya tienes muchas dudas sobre los parámetros de un método, que es la parte básica que deberías conocer previamente. Posiblemente te resulte mas simple el ejemplo de Profesor_Falken, donde evidentemente hace casteo, pero normalmente el concepto va de la mano con el polimorfismo y otros patrones de diseño. Saludos, Última edición por HackmanC; 14/01/2015 a las 14:19 |
Etiquetas: Ninguno |