Anuncios

Bienvenidos sean a este post, hoy hablaremos un poco mas a fondo sobre el polimorfismo y lo pudimos resumir en la siguiente frase:

Anuncios

Cualquier subclase puede usarse como parte del código que usa la superclase.

El Tinchicus
Anuncios
Anuncios

Esto significa que podemos escribir codigo mas simple y facil de entender como tambien mas facil de cambiar o modificar, ademas podemos escribir codigo para la clase maestra y confiar en el hecho de que no importa cuantas veces se subclasifique (es decir se herede), dentro de ciertos parametros, el codigo siempre funcionara.

Para entender mejor este concepto vamos a tomar como ejemplo nuevamente a la clase Animal, cuando lo vimos en el post anterior utilizamos un metodo llamado Hablar dentro de una clase heredera (Perro) para identificarlo pero ahora nosotros vamos a necesitar una accion como es Comer y queremos pasarle una referencia de cual Animal esta siendo alimentado, esto es para evitar tener que crear un metodo por cada clase heredera de esta, en esto entra en accion Polimorfismo, veamos como seria nuestro metodo para la clase Animal:

Animal Alimentar(Animal animal)
{
	return animal;
}
Anuncios

En este caso tenemos dos beneficios: el primero tenemos como parametro en los argumentos del metodo a la clase Animal y esto genera de manera implicita que cualquier clase heredera de Animal puede ser utilizado como parametro, y como el tipo de la funcion es el mismo no nos genera ningun inconveniente al devolverlo.

Anuncios
Hay un pequeño escollo con tipos de retorno polimórficos y es que debemos ser conscientes de lo que se devuelve y hacerlo explícito en el código que llama al método.
Anuncios

Por ejemplo vamos a suponer que tenemos una clase llamado gato y lo alimentaremos de la siguiente manera:

unGato = (gato) Alimentar(unGato)
Anuncios

En este caso la mencion del tipo de clase entre parentesis (gato) es para informarle que la devolucion del metodo Alimentar sera de tipo gato porque recuerden que no devuelve este tipo sino el tipo Animal, esto se lo denomina casting y se utiliza muchas veces para transformar un tipo primitivo en otro tipo, por ejemplo nosotros podemos transformar un double en un float o en un int pero no podemos transformarlo en String o viceversa.

Anuncios

Lo bueno de trabajar de esta forma es que nosotros podemos escribir un codigo hoy y generar otra subclase dentro de una semana, mes o inclusive un año y cada metodo y estructura de datos seguiran trabajando, tambien podes imponer a tus clases hijas que pueden hacer o no asi como tambien deben hacerlo, ergo, un buen diseño en un etapa va a influir en las otras.

Anuncios

Clases Abstractas

En el post anterior mencionamos a la palabra abstract y la usamos para una funcion pero en esta ocasion veremos que son las clases abstractas, las clases abstractas no pueden ser instanciadas y no pueden ser creadas como objetos, tal como vimos en el ejemplo de herencia.

Anuncios
Anuncios

Cuando declaramos una clase abstracta en realidad estamos forzando a ser heredada para poder crear un objeto dado que si o si deberemos crear un clase hija a traves del extends y de esta subclase podamos crear el objeto, tal como vimos en el ejemplo del post anterior, y como vimos en ese ejemplo tambien podemos aplicarlo a un metodo para que este sea redefinido por las clases hijas, vamos a tomar de nuevo el ejemplo de la clase Animal y vamos a modificarla de esta manera:

public abstract class Animal {

    public int edad;
    public float altura;
    public String nombre;

    protected String Hablar(){
        return "El Animal esta hablando";
    }

    Animal Alimentar(Animal animal){
        return animal;
    }
    
    protected abstract String Caminar();
}
Anuncios
Anuncios

En esta modificacion ya no podremos crear objetos de la clase Animal sino solamente herederos como hicimos antes: Perro, Gato, Loro, etc. Al igual que antes tambien podremos seguir definiendo o redifiniendo los metodos en nuestras clases hijas, es decir que en ningun momento perdemos el polimorfismo o las ventajas de la herencia pero ganando la proteccion para no instanciar objetos de forma incorrecta porque en la vida real nosotros tendremos animales definidos y no animales abstractos.

En general trabajaremos de esta forma, como hicimos en el ejemplo del post anterior donde teniamos una clase maestra que hacia de molde, NaveAlien, y de ahi creabamos los distintos tipos de nave con las caracteristicas en comun como pueden ser un valor para un escudo y otro para el nombre de la nave, tambien compartieron un metodo para disparar pero cada uno lo definio para su necesidad pero a su vez si quisieramos agregar metodos propios o valores propios para cada clase hija tambien podemos hacerlo, como podemos darnos cuenta es una herramienta sumamente poderosa, pasemos al siguiente tema.

Anuncios

Interfaces

Las interfaces son basicamente clases abstractas con metodos abstractos y sin variables, podemos decir que son solamente esquemas de una clase, veamos un ejemplo donde crearemos una interfaz para nuestra clase Animal:

public interface AnimalAcciones {

    public String Caminar();
    public Animal Alimentar(Animal animal);
    public String Hablar();
}
Anuncios
Anuncios

Las interfaces se declaran con la palabra interface en lugar de class para decirle al lenguaje que todo lo demas es abstracto y no tendra nada definido solo declarado, para este caso tenemos los tres prototipos de las acciones que estuvimos viendo para los animales como son Caminar, Alimentar y Hablar, para poder implementar esta interfaz debemos hacer la siguiente modificacion en la clase Animal:

public abstract class Animal implements AnimalAcciones {

    public int edad;
    public float altura;
    public String nombre;

    public String Hablar(){
        return "El Animal esta hablando";
    }

    public Animal Alimentar(Animal animal){
        return animal;
    }
}
Anuncios

Para implementar las interfaces debemos usar la palabra implements y no extends seguido del nombre de la interfaz, esta clase sigue siendo abstract es decir que las interfaces no afectan a estos modificadores, y en esta clase definimos dos metodos de la interfaz pero esto no es obligatorio porque como esta es implementada en la clase maestra tambien son heredadas por las clases hijas y permitiendo que se definan o redefinan en las clases hijas pero cual puede ser la ventaja de trabajar con esto?

Anuncios

En realidad ventaja como tal no existe pero Java, a diferencia de C++, no puede implementar la herencia multiple y esto lo soluciona por medio de las interfaces ya que si podemos implementar multiples interfaces, permitiendonos trabajar con distintos implementaciones en una misma clase pero de esto hablaremos mas adelante.

Anuncios

En resumen, hoy hemos visto lo que es el polimorfismo, que es, como nos puede ayudar, hemos visto las clases abstractas, como nos ayudan y para que se pueden usar, por ultimo visto que es una interfaz, que es, como se implementa y para que nos puede ser util, esten atento a este ultimo porque sera mas importante de lo que creen, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00