Ver Mensaje Individual
  #9 (permalink)  
Antiguo 13/01/2015, 21:02
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 8 meses
Puntos: 260
Sonrisa Respuesta: [Ayuda]Upcast y downcast

Hola,

Posiblemente

Cita:
Iniciado por tapiadiego335 Ver Mensaje
...Ese es el fin del casteo?
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.

Cita:
Iniciado por tapiadiego335 Ver Mensaje
[B]Pero cual es la ventaja del cast? ...
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
  1. public void enviarMensaje(Transporte transporte, Mensaje mensaje) {
  2.   transaporte.enviar(mensaje);
  3. }

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
  1. public interface Transporte {
  2.   void enviar(Mensaje mensaje);
  3. }
  4.  
  5. public class TransporteEmail implements Transporte {
  6.   public void enviar(Mensaje mensaje) {
  7.     // enviar por correo ...
  8.   }
  9. }
  10.  
  11. public class TransporteTwitter implements Transporte {
  12.   public void enviar(Mensaje mensaje) {
  13.     // enviar por twitter ...
  14.   }
  15. }
  16.  
  17. public class TransporteSubliminal implements Transporte {
  18.   public void enviar(Mensaje mensaje) {
  19.     // enviar mentalmente ...
  20.   }
  21. }

Y posiblemente la forma de usar el downcast es el siguiente ...

Código Java:
Ver original
  1. ClaseEnviar ce = new ClaseEnviar();
  2. Transporte ts = new TransporteSubliminal();
  3. ce.enviarMensaje(ts, new Mensaje());

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,