Patrones de Diseño: 
Polimorfismo
¿Qué es? 
"El polimorfismo es la propiedad que permite que una 
misma operación sea aplicada a varios objetos de 
distintos tipos"
Programar para la interfaz no la implementación se 
hace posible usando los distintos tipos de polimorfismo.
¿Qué no es? 
"El polimorfismo te permite llamar métodos de una 
clase sin saber el tipo exacto de la clase" 
"La herencia permite a clases derivadas de una 
compartir parte de la interfaz y compartir código" 
Aunque se usen de maneras iguales ( extend ) no son lo 
mismo.
Tipos de polimorfismo
Polimorfismo estático ó Ad-Hoc 
También conocido cómo function overloading ó 
sobrecarga de métodos en el mundo Java. 
public Employee getEmployee(int id) { 
... 
} 
public Employee getEmployee(String name) { 
... 
}
Polimorfismo dinámico ó Parametric 
Polymorphism 
En Java se ha implementado mediante Generics: 
ArrayList<String> strings = new ArrayList<String>(); 
// Gson.java 
public <T> T fromJson(String json, Type typeOfT){ 
... 
}
En algunas Api's más antiguas se puede ver como se 
implementó aceptando un Objeto del tipo Object, cómo 
todos los objetos en Java extienden de Object se 
consigue el mismo funcionamiento: 
private JsonElement createJsonElement(Object value) { 
return value == null ? JsonNull.INSTANCE : new JsonPrimitive(value); 
}
Subtyping 
Es un tipo de polimorfismo en el que el subtipo (el pato 
por ejemplo), está relacionado con el supertipo (el 
pájaro) permitiendo usarlos indistintamente y 
sustituirlos sin problema.
private void feed(Bird aBird) { 
... 
} 
// vs 
private void feed(Cuckoo aCuckoo) { 
... 
} 
private void feed(Duck aDuck) { 
... 
} 
private void feed(Ostrich aOstrich) { 
... 
}
Detectar cuando puede ser interesante 
usar el polimorfismo 
4 Buscar clases o tipos que tengan comportamientos 
muy parecidos 
4 Buscar metodos que usen if's 
4 Asignar esa responsabilidad a distintos tipos 
(clases)
public void executePayment(String paymentMode){ 
if (paymentMode.equals(“Cash”)){ 
... 
}else if(paymentsMode.equals("Card")){ 
... 
}else if(paymentsMode.equals("Check")){ 
... 
} 
}
public void executePayment(Payment paymentMode){ 
paymentMode.executePayment(); 
}
Pros 
4 Permite hacer clases más genéricas, permitiendo 
cambiar en el futuro la implementación. 
4 Permite programar hacía la interfaz, ayuda mucho 
cuando la implementación no está clara todavía. 
4 Facilita el testing ( black box testing )
Contras 
4 Es facil caer en la tentación de hacer las cosas 
demasiado genéricas, aún habiendo muchas 
posibilidades de que no vayan a cambiar en el futuro 
( YAGNI )
¿Preguntas?

Patrones de diseño: Polimorfismo

  • 1.
    Patrones de Diseño: Polimorfismo
  • 2.
    ¿Qué es? "Elpolimorfismo es la propiedad que permite que una misma operación sea aplicada a varios objetos de distintos tipos"
  • 3.
    Programar para lainterfaz no la implementación se hace posible usando los distintos tipos de polimorfismo.
  • 4.
    ¿Qué no es? "El polimorfismo te permite llamar métodos de una clase sin saber el tipo exacto de la clase" "La herencia permite a clases derivadas de una compartir parte de la interfaz y compartir código" Aunque se usen de maneras iguales ( extend ) no son lo mismo.
  • 5.
  • 6.
    Polimorfismo estático óAd-Hoc También conocido cómo function overloading ó sobrecarga de métodos en el mundo Java. public Employee getEmployee(int id) { ... } public Employee getEmployee(String name) { ... }
  • 7.
    Polimorfismo dinámico óParametric Polymorphism En Java se ha implementado mediante Generics: ArrayList<String> strings = new ArrayList<String>(); // Gson.java public <T> T fromJson(String json, Type typeOfT){ ... }
  • 8.
    En algunas Api'smás antiguas se puede ver como se implementó aceptando un Objeto del tipo Object, cómo todos los objetos en Java extienden de Object se consigue el mismo funcionamiento: private JsonElement createJsonElement(Object value) { return value == null ? JsonNull.INSTANCE : new JsonPrimitive(value); }
  • 9.
    Subtyping Es untipo de polimorfismo en el que el subtipo (el pato por ejemplo), está relacionado con el supertipo (el pájaro) permitiendo usarlos indistintamente y sustituirlos sin problema.
  • 10.
    private void feed(BirdaBird) { ... } // vs private void feed(Cuckoo aCuckoo) { ... } private void feed(Duck aDuck) { ... } private void feed(Ostrich aOstrich) { ... }
  • 11.
    Detectar cuando puedeser interesante usar el polimorfismo 4 Buscar clases o tipos que tengan comportamientos muy parecidos 4 Buscar metodos que usen if's 4 Asignar esa responsabilidad a distintos tipos (clases)
  • 12.
    public void executePayment(StringpaymentMode){ if (paymentMode.equals(“Cash”)){ ... }else if(paymentsMode.equals("Card")){ ... }else if(paymentsMode.equals("Check")){ ... } }
  • 13.
    public void executePayment(PaymentpaymentMode){ paymentMode.executePayment(); }
  • 14.
    Pros 4 Permitehacer clases más genéricas, permitiendo cambiar en el futuro la implementación. 4 Permite programar hacía la interfaz, ayuda mucho cuando la implementación no está clara todavía. 4 Facilita el testing ( black box testing )
  • 15.
    Contras 4 Esfacil caer en la tentación de hacer las cosas demasiado genéricas, aún habiendo muchas posibilidades de que no vayan a cambiar en el futuro ( YAGNI )
  • 16.