La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Programación Orientada a Objetos Unidad III – Programación Orientada a Objetos en Java Programación I

Presentaciones similares


Presentación del tema: "Programación Orientada a Objetos Unidad III – Programación Orientada a Objetos en Java Programación I"— Transcripción de la presentación:

1 Programación Orientada a Objetos Unidad III – Programación Orientada a Objetos en Java Programación I - 0416202

2 Polimorfismo y Clases Abstractas Contenido Esta lección abarca los siguientes temas: Definición de polimorfismo Polimorfismo basado en la herencia  Upcasting,  Downcasting,  Invalidación de métodos Polimorfismo en sobrecarga de métodos Clases abstractas

3 Polimorfismo y Clases Abstractas Definición de Polimorfismo El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a objetos, las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Múltiple, morfismo = Formas Esto implica que un Objeto puede tomar diversas formas ó comportarse de diferentes maneras dependiendo las situaciones que se presenten durante la ejecución.

4 Polimorfismo y Clases Abstractas Definición de Polimorfismo “Es el mecanismo que permite definir e invocar funciones idénticas en denominación e interfaz, pero con implementación diferente". El polimorfismo se refiere a la posibilidad de definir múltiples clases con funcionalidad diferente, pero con métodos o propiedades denominados de forma idéntica, que pueden utilizarse de manera intercambiable mediante código cliente en tiempo de ejecución.

5 Polimorfismo y Clases Abstractas Definición de Polimorfismo En muchos lenguajes orientados a objetos el polimorfismo se admite tanto en tiempo de ejecución como en tiempo de compilación. La sobrecarga de funciones (funciones con el mismo nombre, pero con cantidad de parámetros y/o tipos de parámetros diferentes) es un ejemplo de polimorfismo en el momento de la compilación. En Java el polimorfismo en tiempo de ejecución, se logra mediante el uso de herencia, clases abstractas e interfaces.

6 Polimorfismo y Clases Abstractas Definición de Polimorfismo Según lo anterior, el polimorfismo en cualquier lenguaje de POO, puede ser usado de dos maneras fundamentales:  Polimorfismo basado en Herencia.  Polimorfismo en Sobrecarga de Métodos

7 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia La mayoría de los sistemas de programación orientada a objetos proporcionan polimorfismo a través de la herencia. Éste permite que las instancias de diferentes clases reaccionen de una forma particular al llamado de una función. El polimorfismo basado en la herencia implica definir métodos en una clase base y reemplazarlos con nuevas implementaciones en clases derivadas.

8 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Cuando una clase hereda de otra, la subclase “es un” tipo de la superclase. Los objetos de una subclase se pueden referenciar usando una referencia o tipo de superclase. Por ejemplo: Dada una clase Bicicleta y una clase RoadBike (bicicleta de carretera) como extensión de Bicicleta, está perfectamente permitido almacenar un objeto RoadBike en una referencia de Bicicleta. El tipo de una variable (o referencia) no determina el tipo real del objeto al que se refiere. Por lo tanto, una referencia o variable de Bicicleta puede contener o no un objeto del tipo de superclase Bicicleta, dado que contiene cualquier subclase de Bicicleta. Bicicleta bike = new RoadBike();

9 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Cuando una variable o referencia refiere a diferentes tipos de objetos, se denomina polimorfismo. En programación, el polimorfismo permite variables para hacer referencia a varios tipos de objetos diferentes y significa que pueden tener múltiples formas. Por ejemplo, porque RoadBike “es una” Bicicleta, hay dos referencias posibles que definen el tipo de objeto que es (Bicicleta o RoadBike (bicicleta de carretera)).

10 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia El polimorfismo se puede visualizar como un conjunto de muñecas rusas: el conjunto de muñecas comparte un tipo y una apariencia, pero son todas únicas de alguna manera. Cada muñeca tiene la misma forma, con un tamaño determinado por la muñeca dentro de la cual debe encajar. Cada muñeca más pequeña se guarda dentro de la muñeca más grande siguiente. Desde afuera no puede ver a las muñecas más pequeñas, pero puede abrir cada muñeca para encontrar una muñeca más pequeña adentro.

11 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia De manera similar, las subclases se pueden “adaptar” al tipo de referencia de una superclase. La variable de una superclase puede sostener o guardar el objeto de una subclase, mientras mira y actúa como la superclase.

12 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Si “abre” la variable de una superclase o invoca uno de sus métodos, encontrará que efectivamente tiene el objeto de una subclase guardado adentro. Por ejemplo, con las muñecas rusas, no puede ver la muñeca más pequeña hasta que abra a la muñeca más grande. Su tipo puede ser ambiguo. Cuando se compila el código Java, éste no verifica qué tipo (supertipo o subtipo) de objeto se encuentra dentro de una variable. Cuando se ejecuta el código Java, éste “abrirá” para ver qué tipo de objeto se encuentra dentro de la referencia e invocará a los métodos que sean de ese tipo.

13 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia La Herencia y las variables polimórficas permiten la creación de colecciones de objetos heterógeneas. Colecciones de objetos con diferentes tipos de clases son denominados Colecciones Heterogéneas. Formas[] figuras = new Formas[10]; figuras[0] = new Circulo(); figuras[1] = new Triangulo(); figuras[2] = new Rectangulo(); … Formas[] figuras = new Formas[10]; figuras[0] = new Circulo(); figuras[1] = new Triangulo(); figuras[2] = new Rectangulo(); … Por ejemplo: Asumiendo que Circulo, Triangulo y Rectangulo son hijas de Formas

14 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Upcasting El polimorfismo basado en Herencia se divide en: Polimorfismo basado en herencia Upcasting Downcasting Invalidación de métodos del padre Clase A Clase B ¿Qué puedo hacer? 1. Crear objetos de la clase A y utilizar atributos y métodos de la clase A 2. Crear objetos de la clase B y utilizar atributos y métodos de las clases A y B (porque B es hija A) 3. Transformar objeto de tipo B en uno tipo A

15 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Upcasting Upcasting Interpretar un objeto de una clase hija como del mismo tipo que la clase padre. Es una generalización. Siguiendo con el ejemplo de Fomas y Circulo, podemos hacer lo siguiente: Formas figura1 = new Círculo(); podemos acceder a los métodos de Forma pero no de Círculo Lo anterior se denomina upcasting. Como se observa creamos un objeto de tipo Círculo pero lo asignamos a un objeto de tipo Formas. Con lo cual podemos acceder a los métodos de Forma pero no de Círculo salvo el caso que tengan un método con el mismo nombre, en cuyo caso accederemos al del Círculo.

16 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Downcasting El polimorfismo basado en Herencia se divide en: Polimorfismo basado en herencia Upcasting Downcasting Invalidación de métodos del padre Clase A Clase B ¿Qué puedo hacer? Enviar el objeto B a un método y recibirlo como un objeto A

17 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Downcasting Downcasting Interpretar un objeto de una clase base como del mismo tipo que una de sus clases hijas. Es una especialización. Siguiendo con el ejemplo de Formas, podemos hacer lo siguiente: Formas figura1 = new Circulo(10); Circulo cir1 = (Circulo) figura1; //se convierte la referencia de tipo cir1.setRadio(50); Lo anterior se denomina downcasting. Entonces podemos acceder a todos los métodos de ejecutivo.

18 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Invalidación El polimorfismo basado en Herencia se divide en: Polimorfismo basado en herencia Upcasting Downcasting Invalidación de métodos del padre Clase A Clase B ¿Qué puedo hacer? Si en A hay un método, se puede sobreescribir ese método en B, colocándole el mismo nombre

19 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Invalidación Invalidación de métodos Es la manera de redefinir los métodos con el mismo tipo de devolución y parámetros, al agregar o invalidar la lógica existente en el método de una subclase. La invalidación es diferente de la sobrecarga de un método. La sobrecarga de un método significa que el programador conserva el mismo nombre (por ej.: toString()), pero cambia los parámetros de ingreso (firma del método). La invalidación esencialmente oculta el método del padre con la misma firma y no será invocado en el objeto de una subclase a menos que la subclase use la palabra clave super. La invalidación no cambia los parámetros. Solo cambia la lógica dentro del método definido en la superclase.

20 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia - Invalidación Ejercicio: En el Proyecto de las Formas, crear en la superclase y subclases, un public class Formas{ public Formas() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public class Formas{ public Formas() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public class Circulo extends Formas{ public Circulo() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public class Circulo extends Formas{ public Circulo() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public class Principal{ public static void main(){ Formas figura = new Circulo(); figura.mensaje(); } public class Principal{ public static void main(){ Formas figura = new Circulo(); figura.mensaje(); } método “mensaje” que imprima el nombre de la Clase.

21 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia ¿De qué manera se ven afectados los métodos en la subclase por el polimorfismo? Recuerde que las subclases pueden heredar métodos de sus superclases. Si la variable Formas puede mantener al tipo de objeto de las subclases, ¿cómo sabe Java qué métodos debe invocar cuando se invoca a un método invalidado? Los métodos invocados en una referencia Formas (figura) siempre se refieren a los métodos en el tipo de objeto (Circulo). Esto quiere decir, que la salida del programa anterior será: Formas figura = new Círculo(); Circulo

22 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Imagine que la clase Circulo tiene el método setRadio(float radio) y Formas un método setColor(String color). ¿Qué ocurre cuando hacemos lo siguiente?: Que sucede si invocamos: figura.setColor(“Verde”); figura.setRadio(20); public class Formas{ protected String color; public Formas() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public void setColor(String c){ color=c; } } public class Formas{ protected String color; public Formas() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public void setColor(String c){ color=c; } } public class Circulo extends Formas{ private float radio; public Circulo() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public void setRadio(float r){ radio=r; } } public class Circulo extends Formas{ private float radio; public Circulo() { } public void mensaje(){ System.out.println(this.getClass().getName() ); } public void setRadio(float r){ radio=r; } } Formas figura = new Círculo();

23 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Distribución dinámica de un método Java puede determinar qué método invocar en base al tipo de objeto al que se hace referencia en el momento de invocar el método. La distribución dinámica de un método, conocida como enlace dinámico, le permite a Java determinar de manera correcta y automática qué método invocar en base al tipo de referencia y tipo de objeto. Para el caso anterior: figura.setColor(“Verde”); figura.setRadio(20); 

24 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Ejemplo: Ejemplo: Diagrama de clases incompleto, que representa un modelo del Juego de Ajedrez. En la jerarquía de Herencia de la Pieza, la implementación de los métodos dependerá del tipo de pieza.

25 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Ejemplo: public class Instrumento { protected String nombre; public Instrumento() { } public void tocar() { System.out.print("Instrumento.tocar()"); } class Guitarra extends Instrumento { public int nro_cuerdas; public Guitarra(){ } public void tocar() { System.out.println("Guitarra.tocar()");} } class Guzla extends Guitarra { public String tono; public Guzla(){ } public void tocar() { System.out.println("Guzla.tocar()");} } public class Implementacion { public Implementacion() { } public void afinar(Instrumento i) { i.tocar(); } public void afinarTodo(Instrumento[] e) { for (int i = 0; i < e.length; i++) this.afinar(e[i]); } public static void main(String[] args) { Implementacion obj = new Implementacion(); Instrumento[] orquesta=new Instrumento[2]; int i = 0; orquesta[i++] = new Guitarra(); orquesta[i++] = new Guzla(); obj.afinarTodo(orquesta); } } Argumento polimórfico Argumento polimórfico

26 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Argumentos polimórficos Se pueden escribir métodos que acepten como argumentos objetos genéricos y trabajar apropiadamente con objetos de cualquier subclase. Por ejemplo: El método afinar puede recibir en i la referencia de un objeto de Instrumento, Guitarra o Guzla. //En la clase Implementacion public void afinar (Instrumento i ){ i.tocar(); }

27 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Operador instanceof Suponga ahora que en el método afinar, antes de invocar al método tocar, debe registrar el número de cuerdas ó ajustar el tono dependiendo si se trata de una Guitarra ó una Guzla, respectivamente. Primero se debe verificar que la referencia que llega en i sea una Guitarra ó una Guzla. public void afinar (Instrumento i){ if (i instanceof Guitarra) { //Proceso si es una Guitarra } else if (i instanceof Guzla) { //Proceso si es una Guzla } i.tocar(); }

28 Polimorfismo y Clases Abstractas Polimorfismo basado en la herencia Casting de objetos En circunstancias en que se recibe la referencia a la clase Padre y se tiene actualmente un objeto a una Subclase, se puede restaurar la funcionalidad del objeto haciéndole un casting a la referencia. Por ejemplo: public void afinar (Instrumento i){ if ( i instanceof Guitarra) { Guitarra obj1=new Guitarra(); obj1=(Guitarra) i; obj1.nro_cuerdas=5; obj1.tocar(); } else if ( i instanceof Guzla) { Guzla obj2=new Guzla(); obj2=(Guzla) i; obj2.tono="re"; obj2.tocar(); } else i.tocar(); }

29 Polimorfismo y Clases Abstractas Polimorfismo en sobrecarga de métodos El concepto de polimorfismo, en cuanto a cambio de forma, se puede extender a los métodos. Java permite que varios métodos dentro de una clase se llamen igual, siempre y cuando su lista de parámetros sea distinta. Por ejemplo, si tuviéramos un método que sirviera para sumar números pero sin indicar de qué tipo.

30 Polimorfismo y Clases Abstractas Polimorfismo en sobrecarga de métodos /* Diversos modos de sumar */ public class Sumar { public float suma(float a, float b) { System.out.println("Estoy sumando reales"); return a+b; } public int suma(int a, int b) { System.out.println("Estoy sumando enteros"); return a+b; } public static void main(String[] args) { float x = 1, float y = 2; int v = 3, int w = 5; System.out.println(suma(x,y)); System.out.println(suma(v,w)); } }

31 Polimorfismo y Clases Abstractas Polimorfismo en sobrecarga de métodos La sobrecarga de métodos también puede ser aplicada a los constructores. Por ejemplo: public class Rectangulo { private int x1, y1, x2, y2; public Rectangulo(int ex1, int ey1, int ex2, int ey2){ x1 = ex1; x2 = ex2; y1 = ey1; y2 = ey2; } public Rectangulo(){ x1 = 0; x2 = 0; y1 = 1; y2 = 1; } public int calcularArea(){ return (x2-x1) * (y2-y1); } }

32 Polimorfismo y Clases Abstractas Clases Abstractas ¿Es realmente necesario definir una clase Formas, si solo vamos a crear objetos de sus subclases: Círculos, Triángulos y Rectángulos? Las clases abstractas son una alternativa que se ocupa de éste problema, ya que de ellas, no se pueden crear instancias. Esto significa que usted no puede instanciar objetos de este tipo. Pero si es posible crear variables o referencias de este tipo. Si declaramos que la clase Formas es abstracta, todavía podemos usar la siguiente sintaxis, pero no podemos efectivamente crear un objeto Forma. Esto significa que todas las referencias al tipo Formas se referirán a los objetos de la subclases.

33 Polimorfismo y Clases Abstractas Clases Abstractas Las clases abstractas pueden contener métodos totalmente implementados que se “pasan” a cualquier clase que los extienda. Puede hacer que una clase sea abstracta mediante la palabra clave abstract. Las clases abstractas también pueden declarar por lo menos un método abstracto (que no contiene ninguna implementación). Esto significa que las subclases deben usar prototipo del método (esquema) y deben implementar estos métodos. Los métodos abstractos se declaran con la palabra clave abstract. public abstract class Formas abstract public void getArea () ; No tienen implementación alguna {}

34 Polimorfismo y Clases Abstractas Métodos Abstractos Los métodos abstractos: No pueden tener el cuerpo de un método. Deben ser declarados en una clase abstracta. Deben estar invalidados en una subclase. Esto obliga a los programadores a implementar y redefinir los métodos. En general, las clases abstractas contienen métodos abstractos, métodos parcialmente implementados o métodos totalmente implementados.

35 Polimorfismo y Clases Abstractas Métodos Abstractos Ejemplo: public abstract class figura { protected double x; protected double y; public figura(double i, double j) { x = i; y = j; } public abstract void mostrar_area(); } public class triangulo extends figura { public void mostrar_area() { System.out.println(“Area de triangulo=”+(x*y*0.5)); } } public class rectangulo extends figura { public void mostrar_area() { System.out.println(“Area de rectangulo=”+(x*y)); } }

36 Polimorfismo y Clases Abstractas Características Clases Abstractas Las clases abstractas tienen una característica importante: no se pueden instanciar objetos de esa clase. Formas x = new Formas(); La única forma de utilizar una clase abstracta es creando clases hijas que hereden de ella. Las subclases de una clase abstracta deben:  Sobre-escribir todos los métodos abstractos de la superclase, o bien;  Ser declaradas como clases abstractas. No se pueden definir constructores abstractos o métodos estáticos abstractos.

37 Polimorfismo y Clases Abstractas Características Clases Abstractas No todos los métodos de una clase abstracta tienen que estar sin implementación, pero con que solamente exista un método abstracto, la clase debe declararse abstracta. public abstract class Figura { public Figura() { } public double area() { return 0.0; } public double volumen() { return 0.0; } public abstract String devolverNombre(); }

38 Polimorfismo y Clases Abstractas Ejercicio práctico Como ejemplo de éste y el resto de conceptos vistos, plantearemos el siguiente ejercicio: Un banco requiere un sistema que permita llevar el control de las cuentas abiertas a los clientes. Existen dos tipos de cuenta que pueden ser: Cuenta corriente o Cuenta de ahorros. El sistema debe contar con las siguientes opciones: 1.Crear Cuenta 2.Consultar Cuenta 3.Realizar Transacción 4.Salir

39 Polimorfismo y Clases Abstractas Ejercicio práctico Este diagrama resuelve los requerimientos del banco pero no establece distinción entre una Cuenta Corriente y una Cuenta de Ahorros. Suponga que el banco tiene un nuevo requerimiento, en el cual exige que cada cuenta lleve el registro de sus transacciones y que además en la Cuenta Corriente solo se permitan las transacciones Depósito y Cobro de Cheque y en la de ahorros se permita únicamente Depósito y Retiro El siguiente diagrama resuelve el problema pero sigue teniendo fallas En primer lugar, el método realizarTransaccion debe hacer un condicional para poder aplicar las restricciones dependiendo del tipo de cuenta. Lo siguiente, es que el método getMonto debe hacer un condicional, ya que para Retiro o Cobro de cheque el monto es negativo y para Deposito el monto es positivo. La situación se agrava si se agregan nuevos tipos de cuenta y/o de transacciones. Lo cual implicaría modificar gran parte del código del sistema. Usando herencia y polimorfismo se logra un modelo más flexible a las modificaciones. Este método en cursiva indica que es abstracto, lo que significa que será implementado en las clases hijas. El nombre de la clase en cursiva indica que es abstracta. Como cada clase “concreta” implementa el método abstracto heredado de la clase base, aplicará sólo las restricciones correspondientes a los objetos de su clase, flexibilizando así el modelo. Se llama clase “concreta” a aquellas clases que no son abstractas Si se agrega un nuevo tipo de Cuenta y/o Transacción, habrá que modificar muy pocas partes del sistema

40 Polimorfismo y Clases Abstractas Ejercicio práctico Manos a la obra!, desarrolla la aplicación utilizando POO y el lenguaje de programación Java.

41


Descargar ppt "Programación Orientada a Objetos Unidad III – Programación Orientada a Objetos en Java Programación I"

Presentaciones similares


Anuncios Google