polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

16

Click here to load reader

Upload: elunae

Post on 27-Jul-2015

1.743 views

Category:

Documents


1 download

DESCRIPTION

ymca isoo

TRANSCRIPT

Page 1: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

Cuando estamos aprendiendo programación orientada a objetos, nos maravilla la potencia de la herencia y la reutilización de código, en este paper vamos a ver que otras ventajas de la programación orientada a objetos se basan en la herencia.

El polimorfismo, como su mismo nombre sugiere múltiples formas, se refiere a la posibilidad de acceder a un variado rango de funciones distintas a través del mismo interfaz. O sea, que, en la práctica, un mismo identificador puede tener distintas formas (distintos cuerpos de función, distintos comportamientos) dependiendo, en general, del contexto en el que se halle inserto. El polimorfismo se puede establecer mediante la sobrecarga, sobre-escritura y la ligadura dinámica.

Sobrecarga.El término sobrecarga se refiere al uso del mismo identificador u operador en

distintos contextos y con distintos significados.

Si para cada funcionalidad necesitada fuese necesario escribir un método, el código resultante sería inmanejable, imagínense, por ejemplo que los desarrolladores de java hubiesen creado un método para escribir en pantalla una cadena de texto, otro diferente para escribir un entero, otro para escribir un doble, otro para escribir un carácter, otro para una cadena y un entero y así para todas las combinaciones posibles, seria casi imposible conocer dichos métodos en totalidad; en cambio sabemos que con “System.out.print()” o“System.out.println()” podemos escribir cualquier mensaje en pantalla.

Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores. 

La sobrecarga de métodos conduce a que un mismo nombre pueda representar distintos métodos con distinto tipo y número de parámetros, manejados dentro de la misma clase. En el ámbito de la POO, la sobrecarga de métodos se refiere a la posibilidad de tener dos o más métodos con el mismo nombre pero funcionalidad diferente. Es decir, dos o más métodos con el mismo nombre realizan acciones diferentes. El compilados usará una u otra dependiendo de los parámetros usados. Esto también se aplica a los constructores. De hecho, es la aplicación más habitual de la sobrecarga.

Page 2: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

La forma de diferenciar varios métodos sobrecargados es a través de sus parámetros, ya sea por la cantidad, el tipo o el orden de los mismos, veamos un ejemplo:

public class Articulo { private float precio; public void setPrecio() { precio = 3.50; } public void setPrecio(float nuevoPrecio) { precio = nuevoPrecio; } public void setPrecio(float costo, int porcentajeGanancia) { precio = costo + (costo * porcentajeGanancia); }}

Sobre-escritura:La sobre-escritura, se aplica a los métodos y esta directamente relacionada a la herencia y se refiere a la re-definición de los métodos de la clase base en las subclases, por ejemplo, en la relación de herencia del ejemplo de las figuras aunque la clase base “Figura”tiene los métodos “calcularArea” y “calcularPerimetro”, las subclases “Circulo”, “Cuadrado”, “Triangulo” y “Rectangulo”redefinen estos métodos ya que el calculo del área y el perímetro de cada uno de ellos es diferente.

class Figura { protected double area; protected double perimetro; public Figura() { this.area=0; this.perimetro=0; } public double getArea() { return area; } public double getPerimetro() { return perimetro;

Page 3: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

} public void calcularArea(){} public void calcularPerimetro(){} }

public class Circulo extends Figura { private double radio; public Circulo() { super(); } public double getRadio() { return radio; } public void setRadio(double radio) { this.radio = radio; } public void calcularArea() { this.area = Math.PI*Math.pow(this.radio,2.0); } public void calcularPerimetro() { this.perimetro = 2*Math.PI*this.radio; } }

Ligadura dinámica:Gracias a la ligadura dinámica, pueden invocarse operaciones en objetos obviando el tipo actual del éstos hasta el momento de la ejecución del código, es decir que me perite definir elementos como un tipo e instanciarlos como un tipo heredado. Pero cual puede ser la utilidad de este concepto, para que me sirve obviar el tipo de un objeto para luego tomar esta decisión?.

Gracias a que en java la definición de los tipos de objetos se puede producir por atado posterior (late binding), no nos debe preocupar a que tipo de elemento le paso un mensaje ya que el compilador tomara la decisión de que objeto ejecutará que método de acuerdo a la forma de crear la instancia.

Este concepto es bastante complejo de entender ya que estamos acostumbrados a definir los elementos de acuerdo a lo que necesitamos, es decir, si requiero un entero lo declaro como entero, para que declararía yo un elemento como un tipo y lo usaría como otro?. No siempre se puede determinar exactamente el tipo de elemento que va a usarse en la ejecución de nuestro programa, para este tipo de

Page 4: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

casos es cuando es útil aplicar el atado posterior o ligadura dinámica, y se debe tener por lo menos una relación de herencia que por lo menos me permita determinar un tipo base para la declaración, sea cual sea el subtipo que se instancie.

Veamos un ejemplo que nos aclare un poco este concepto:

class Mamifero { public void mover() { System.out.println("Ahora es un mamifero el que se mueve"); }}

class Perro extends Mamifero { public void mover() { System.out.println("Ahora es un perro el que se mueve"); }}

class Perro extends Mamifero { public void mover() { System.out.println("Ahora es un gato el que se mueve"); }}

public class Polimorfismo { public static void muevete(Mamifero m) { m.mover(); } public static void main(String[] args) { Gato bisho = new Gato(); Perro feo = new Perro(); muevete(bisho); muevete(feo); }}

Vemos que el método “muevete” llama al método mover de un mamífero y aunque el no sabe con qué clase de mamífero trata, funciona y se llama al método correspondiente al objeto específico que lo llama (es decir, primero un gato y luego un perro). Si no existiera la ligadura dinámica tendríamos que crear un

Page 5: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

método“muevete” para los mamíferos de tipo “Gato” y otro para los de tipo“Perro”.

Veamos otro ejemplo donde las instancias se crean de forma aleatoria:

public abstract class Instrumento { public Instrumento() { } public abstract void tocar(); public abstract void tocar(String nota); public abstract void afinar();}

public class Cuerda extends Instrumento{ public Cuerda() {} public void afinar() { System.out.println("Cuerda.afinar()"); } public void tocar() { System.out.println("Cuerda.tocar()"); } public void tocar(String nota){ System.out.println("Cuerda.tocar()"+nota); }}

public class Percusion extends Instrumento{ public Percusion() {} public void afinar() { System.out.println("Percusion.afinar()"); } public void tocar() { System.out.println("Percusion.tocar()"); } public void tocar(String nota){ System.out.println("Percusion.tocar()"+nota); }}

public class Viento extends Instrumento{ public Viento() {} public void afinar() { System.out.println("Viento.afinar()"); }

Page 6: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

public void tocar() { System.out.println("Viento.tocar()"); } public void tocar(String nota){ System.out.println("Viento.tocar()"+nota); }}

public class LigaduraDinamica { public static void main(String[] args){ String[] notas = {"Do","Re","Mi","Fa","Sol","La","Si"}; Instrumento orquesta[] = new Instrumento[10];

for(int i=0;i<10;i++){ orquesta[i]=generarInstrumento(new java.util.Random().nextInt(3)); }

for(int i=0;i<10;i++){ afinarInstrumento(orquesta[i]); }

for(int i=0;i<10;i++){ tocarInstrumento(orquesta[i]); }

for(int i=0;i<10;i++){ tocarInstrumento(orquesta[i],notas[i%7]); } } public static Instrumento generarInstrumento(int i){ switch(i){ default: case 0: return new Viento(); case 1: return new Percusion(); case 2: return new Cuerda(); } } public static void afinarInstrumento(Instrumento o){

Page 7: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

o.afinar(); } public static void tocarInstrumento(Instrumento o){ o.tocar(); } public static void tocarInstrumento(Instrumento o,String nota){ o.tocar(nota); }}

Veamos que el método “generarInstrumento” aleatoriamente me crea las instancias de los diferentes tipos de instrumentos y que nuestro arreglo de elementos del tipo de instrumentos es llenado con diferentes elementos de los cuales no podemos controlar que tipo de instancia es creada, solo sabemos que son objetos basados en“Instrumento”, sin embargo los métodos “tocarInstrumento” y“afinarInstrumento” que reciben como parámetro un Instrumento llaman adecuadamente a los métodos “afinar” o “tocar” según la instancia que reciben.

Resumen de polimorfismo

La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos. Así como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se relaciona con los métodos.En general, hay tres tipos de polimorfismo:

Polimorfismo de sobrecarga

Polimorfismo paramétrico  (también llamado polimorfismo de plantillas)

Polimorfismo de inclusión  (también llamado redefinición o subtipado)

Page 8: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

Trataremos de describir ahora con más precisión estos tipos de polimorfismo, pero le sugerimos prestar atención, ya que muchas personas suelen confundirse al tratar de comprender las diferencias existentes entre estos tres tipos.Polimorfismo de sobrecarga

El polimorfismo de sobrecarga ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la función "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla.Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando está haciendo referencia a una operación entre dos números enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenación).Polimorfismo paramétrico

El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente el método correcto a aplicar en función del tipo de datos pasados en el parámetro.Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de addition() efectuando una suma de valores.

El método int addition(int,int) devolvería la suma de dos números enteros.

float addition(float, float) devolvería la suma de dos flotantes.

char addition(char, char) daría por resultado la suma de dos caracteres definidos

por el autor.

etc.Una signature es el nombre y tipo (estático) que se da a los argumentos de una función. Por esto, una firma de método determina qué elemento se va a llamar.Polimorfismo de subtipado

La habilidad para redefinir un método en clases que se hereda de una clase base se llamaespecialización. Por lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica).Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y peón, cada uno heredando el objeto pieza. El método movimiento podría, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular. 

Page 9: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

Última actualización el jueves, 16 de octubre de 2008, 15:43:29 .Este documento intitulado « OOP - Polimorfismo » de Kioskea (es.kioskea.net) esta puesto a diposición bajo la licencia Creative Commons. Puede copiar, modificar bajo las condiciones puestas por la licencia, siempre que esta nota sea visible.

REPASO DE CONCEPTOS BÁSICOS DE PROGRAMACIÓN ORIENTADA A OBJETOS

Razones fundamentales que están influyendo en la importancia de la POOAlgunas de las causas que están influyendo considerablemente en el notable desarrollo de las técnicas orientadas a objetos son:

La OO (orientación a objetos) es especialmente adecuada para realizar determinadas aplicaciones, sobre todo realización de prototipos y simulación de programas

Los mecanismos de encapsulación de POO soportan un alto grado de reutilización de código, que se incrementa por sus mecanismos de herencia.

En el entorno de la base de datos, la OO se adjunta bien a los modelos semánticos de datos para solucionar las limitaciones de los modelos tradicionales.

Aumento espectacular de los lenguajes de programación orientados a objetos. Interfaces de usuarios gráficos (por iconos) y visuales. Las interfaces de usuarios

de una aplicación manipulan la entrada y salida del usuario. Por consiguiente, su función principal es la comunicación con el usuario final. ObjetoLos objetos son entidades que se pueden distinguir de manera clara y definida, ejemplos de un objeto pueden ser una persona, un libro, un botón de orden. Estructura interna de un objeto:La estructura interna de un objeto está compuesta por tres elementos fundamentales como son:

o Propiedades: Son las características observables de un objeto. Las propiedades se reconocen porque describen un aspecto del objeto que podemos medir con una escala establecida previamente. A cada propiedad se le debe asignar un valor el cual permite identificar de manera única al objeto.

o Métodos: Se define como un conjunto de acciones que un objeto puede realizar para conseguir un propósito. Los métodos representan la parte viva e interesante de un objeto y se emplean habitualmente para modificar las propiedades del objeto. Al modificar cualquiera de las propiedades del objeto se altera su apariencia y se genera un cambio que el usuario de la aplicación puede percibir.

o Eventos: Todos los objetos se relacionan con el mundo que los rodea, esto significa que ningún objeto está aislado y siempre recibe el influjo de otros objetos. Los eventos son los estímulos que un objeto ejerce sobre otro Estado de un objeto:

Page 10: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

El estado de un objeto es la apariencia que el objeto presenta al usuario, y depende del valor que tenga sus propiedades. Un cambio de estado se logra alterando al menos una de las propiedades del objeto. Clases:Los objetos están organizados en familias claramente delimitadas. Una familia se reconoce porque reúne un grupo de objetos que heredan elementos entre sí. El modelo de programación visual, al igual que la naturaleza, organiza los objetos en clases (familias), así una clase es el conjunto de objetos que pertenecen a una misma familia. Por ejemplo Madonna, Michael Jackson, Prince y Dire Straits son objetos de una clase cantantes de rock, sin embargo personas específicas con nombres específicos son miembros de esa clase si poseen ciertas características comunes. El modelo de programación visual permite así organizar las familias de objetos en un orden jerárquico. Herencia:Un objeto es heredero de otro cuando posee todas sus propiedades y todos sus métodos y reconoce todos sus eventos, aunque pueda disfrutar de propiedades, métodos y eventos adicionales. Se define la herencia como la característica que tienen los objetos de derivarse unos de otros. Por otra parte la herencia supone una clase base y una jerarquía de clases que contienen las clases derivadas de la clase base, así las clases derivadas pueden heredar las propiedades y métodos de una clase base, añadiendo sus propios métodos y propiedades, incluso cambiar aquellos elementos de la clase base que necesiten sean diferentes. Tipos de Herencia:Existen dos tipos de herencia

o Herencia Simple: En esta jerarquía cada clase tiene como máximo una sola superclase. La herencia simple permite que una clase herede las propiedades y métodos de su superclase en una cadena jerárquica.

o Herencia múltiple: Una malla o retícula consta de clases, cada una de las cuales pueden tener dos o más superclases inmediatas. Una herencia múltiple es aquella en la que cada clase puede heredar las propiedades y métodos de cualquier número de clases. Encapsulamiento:Un objeto está separado del medio que lo rodea por algún tipo de envoltura. Esta separación es la que determina la unidad del objeto, es decir, lo convierte en algo independiente. La envoltura oculta los detalles relacionados con la construcción interior del objeto, esto significa que sólo conocemos del objeto aquello que es revelado por sus métodos. Se llama encapsulamiento a la propiedad que tienen los objetos de ocultar detalles internos, así se permite asegurar que el contenido de la información de un objeto este oculta al mundo exterior (Por ejemplo un objeto A no conoce lo que hace un objeto B y viceversa). Por otra parte el programador que construye un objeto tiene acceso a todas sus partes: propiedades, métodos y definición de eventos. El programador que utiliza un objeto solamente tiene acceso a sus propiedades y métodos (si estos son públicos) y a la programación de los eventos que han sido definidos para el objeto.Algunos métodos y propiedades en un objeto son privados, es decir, útiles únicamente dentro del objeto y desconocidos por quien utiliza el objeto, los

Page 11: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

restantes métodos y propiedades son públicos, t los programadores los emplean para cambiar el estado del objeto. Comunicación entre objetos (mensajes)El mensaje es esencialmente una orden que se envía a un objeto para indicarle que realice alguna acción. También se define mensaje como la información completa que un objeto emisor transmite hacia un objeto receptor.Un mensaje contiene tres elementos: el objeto receptor, el tipo de evento y los datos necesarios para el receptor.

MensajeCuando se produce un evento, el objeto receptor sabe cuál es el objeto emisor, qué evento se produjo y el valor de los datos asociados con dicho evento. Polimorfismo:El polimorfismo se presenta cuando se ha creado objetos que pertenecen a clases que han sido derivadas de otras clases. En otras palabras, el polimorfismo aparece en las clases derivadas.También se dice que el polimorfismo es la propiedad que indica literalmente, la posibilidad de que una entidad tome muchas formas, en términos prácticos el polimorfismo permite referirse a objetos de clases distintas mediante el mismo elemento de programa y realizar la misma operación de diferentes formas, según sea el objeto que se referencia en ese momento. Por ejemplo cuando se describe la clase mamíferos se puede observar que la operación comer es una operación fundamental en la vida de los mamíferos, de modo que cada tipo de mamíferos debe poder realizar la operación o función comer. Por otra parte, una vaca o una cabra que pasta en el campo, un niño que se come un bombón o caramelo y un león que devora a otro animal, son diferentes formas que utilizan los distintos mamíferos para realizar la misma función (comer). Objetos compuestos:Una de las características que hacen a los objetos ser muy potentes es que pueden contener otros objetos. Los objetos que contienen otros objetos se denominan objetos compuestos. Esta característica ofrece dos ventajas importantes:

o Los objetos contenidos pueden cambiar en tamaño y composición, sin afectar al objeto compuesto que los contiene, esto hace que el mantenimiento de sistemas complejos de objetos anidados sea más sencillo.

o Los objetos contenidos están libres para participar en cualquier número de objetos compuestos, en lugar de estar bloqueados en un único objeto compuesto.12. Reutilización con orientación a objetos:Reutilización o reutilizabilidad es la propiedad por la que software desarrollado puede ser utilizado cuantas veces sea necesario en más de un programa. Así por ejemplo, si se necesita una función que calcule el cuadrado o el cubo de un número, se puede crear una función que realice la tarea que el programa necesite. Las ventajas de la reutilización son evidentes, el ahorro de tiempo es sin duda una de las ventajas más considerables y otra es la facilidad para intercambiar software desarrollado por diferentes programadores.13. Objetos y reutilización:La programación orientada a objeto proporciona el marco idóneo para la reutilización de las clases. Los conceptos de encapsulamiento y herencia son las

Page 12: Polimorfismo y herencia es mucho más potente que simplemente una herramienta de reutilización

bases que facilitan la reutilización. Un programador puede utilizar una clase existente y sin modificarla, añadirle nuevas características y datos. Esta operación se consigue derivando una clase a partir de la clase base existente, la nueva clase hereda las propiedades de la antigua, pero se pueden añadir nuevas propiedades. Por ejemplo, suponga que se escribe una clase Menú que crea una sistema menú (barras de desplazamiento, cuadros de diálogos, botones, etc.), con el tiempo, aunque la clase funciona bien, se observa que sería interesante que las leyendas de las opciones de los menús parpadearán o cambiarán el color. Para realizar esta tarea se diseña una clase derivada de menú que añada las nuevas propiedades de parpadeo o cambio de colorLa facilidad para reutilizar clases y en consecuencia objetos es una de las propiedades fundamentales que justifican el uso de la programación orientada a objeto. Por esta razón los sistemas y en particular los lenguajes orientados a objetos suelen venir provistos de un conjunto (biblioteca) de clases predefinidas que permiten ahorrar tiempo y esfuerzo en el desarrollo de cualquier aplicación.14. Constructor:Los constructores son métodos o funciones que existen dentro de todos los objetos, y que se activan solamente en el momento de la creación del objeto. Los constructores sirven para definir los valores iniciales de las propiedades del objeto. También se dice que un constructor es una operación que crea un objeto y/o inicializa su estado.15. Destructor:El destructor es un método que se activa cuando el objeto desaparece. El destructor es único y sirve para que un objeto ejecute una acción (o grupo de acciones) antes de terminar su ciclo vital. Normalmente loa objetos dejan de existir cuando salen de su ámbito (entorno) en donde fueron creados. Los destructores son importantes porque se activas automáticamente, y eximen al programador de la tarea de liberar los recursos tomados por el objeto, ya que normalmente esta es la tarea ejecutada por el destructor.EmisorMensajeReceptor