Todos los logos y marcas utilizados en este documento, estn registrados y pertenecen a sus respectivos dueos. AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 1
Curso: "Programacin Java SE" 2013
Introduccin En la programacin orientada a objetos, el polimorfismo se refiere a la capacidad de un lenguaje de programacin para procesar los objetos de manera diferente en funcin de su tipo de datos de referencia, sea sta su interfaz o la clase que pertenece. Ms especficamente, es la capacidad de redefinir los mtodos de clases derivadas. En s la palabra polimorfismo refiere a muchas formas y aplicado a la POO es la capacidad de poder tomar varias clases que tiene operaciones iguales y poder invocar a cualquier instancia el mismo mtodo comn. Ventajas: Poder hacer un diseo genrico que se apliquen a varios objetos que tienen operaciones comunes. Otra forma de decirlo es la capacidad del lenguaje de responder a un mismo mensaje de diferentes maneras. Adecundose a la situacin actual. En Java NO slo se presenta en la Herencia (mediante jerarqua), sobrecarga de mtodos y sobre- escrituras de mtodos y atributos que vimos recientemente, sino que tambin estn presentes en las implementaciones de Interfaces. Polimorfismo es considerado fundamental para cualquier lenguaje de programacin orientado a objetos (LPOO). Las herencias de clases definen el "qu son" y las de interfaces agrupan clases que definen el "qu hacen", es decir las interfaces describen algunas de las caractersticas de una clase. Cuando agrupamos por herencia hay una relacin de parentesco, pero con las interfaces agrupamos objetos que "hacen cosas similares" como una interfaz "imprimible" que todos nuestros objetos debieran de implementar para poder pasar por la impresora (les estamos diciendo de alguna forma que deben cumplir con un "contrato de implementacin" para poder ser "imprimibles"). AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 2
Curso: "Programacin Java SE" 2013
Objetivo El objetivo de esta prctica de laboratorio es exponer los conceptos que hay detrs del polimorfismo implementando clases abstractas e interfaces.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 3
Curso: "Programacin Java SE" 2013
Ejercicio 1: Crear una aplicacin para un catlogo de productos usando clase abstracta. Algunas veces, una clase que se ha definido representa un concepto abstracto y como tal, no debe ser ejemplarizado. Es decir cuando se desarrolla una jerarqua de clases en que algn comportamiento est presente en todas ellas pero se materializa de distintas formas para cada una. Por ejemplo, la comida en la vida real. Has visto algn ejemplar de comida? No. Lo que has visto son ejemplares de manzanas, pan, y chocolate. Comida representa un concepto abstracto de cosas que son comestibles. No tiene sentido que exista un ejemplar de comida. Por ejemplo, la clase Number del paquete java.lang representa el concepto abstracto de nmero. Otros ejemplos: Clase Elementos del Formulario, Figuras Geomtricas, Personas, Mamferos, Automviles etc. El modificador abstract declara que la clase es una clase abstracta. Una clase abstracta puede contener mtodos abstractos, estos son mtodos que no tienen implementacin y slo se deben implementar en las clases hijas (sub-clases). Una clase abstracta est diseada para ser una superclase y no puede ejemplarizarse.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 4
Curso: "Programacin Java SE" 2013
1. Abrir Netbeans IDE 2. Crear un proyecto Netbeans: Java Application Seleccionar File desde el men superior y seleccionar New Project. Observar que aparece la ventana de dialogo New Project. Seleccionar Java bajo Categories, y Seleccionar Java Application bajo la seccin Projects. Clic Next.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 5
Curso: "Programacin Java SE" 2013
Bajo el panel Name and Location, para el Nombre del Proyecto (Project Name), ingrese ProyectoCatalogoUsandoClaseAbstracta. Este es el nombre que se le dar al proyecto. Para el campo Create Main Class, ingresar EjemploCatalogo. (Figura de abajo) Esto es para generar la clase autnoma EjemploCatalogo.java, que contendr el mtodo main(..) que ser generado por Netbeans. Clic Finish. AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 6
Curso: "Programacin Java SE" 2013
Observe que el proyecto ProyectoCatalogoUsandoClaseAbstracta y ha sido creado bajo la pestaa Projects de NetBeans IDE y adems ha generado automticamente la clase EjemploCatalogo.java la cual es desplegada en el editor de cdigo del IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 7
Curso: "Programacin Java SE" 2013
3. Creando la clase java Producto: Clic derecho en el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionamos New->Java Class.
Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Producto Para el nombre del paquete (Packages), ingrese dominio Clic Finish. AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 8
Curso: "Programacin Java SE" 2013
Observe que se crea la clase Producto.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Producto.java como se muestra en el Cdigo de abajo, poner especial atencin en el modificador abstract de la clase, en el mtodo abstracto getPrecioVenta y en el atributo precio con sus respectivos mtodos getter/setter y el constructor. package dominio;
/** * @author Andrs Guzmn */ public abstract class Producto {
private int precio;
public Producto(int precio) { this.precio = precio; }
public int getPrecio() { return precio; }
abstract public double getPrecioVenta(); } AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 9
Curso: "Programacin Java SE" 2013
4. Creando la clase java Electronico: Clic derecho en el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Electronico Para el nombre del paquete (Packages), ingrese dominio Clic Finish.
Observe que se crea la clase Electronico.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Electronico.java como se muestra en el Cdigo de abajo, poner especial atencin en el modificador abstract de la clase, el extends de Producto y en el atributo fabricante con sus respectivos mtodos getter/setter y en el constructor.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 10
Curso: "Programacin Java SE" 2013
package dominio; /** * @author Andrs Guzmn */ public abstract class Electronico extends Producto {
private String fabricante;
public Electronico(int precio, String fabricante) {
super(precio); this.fabricante = fabricante; }
public String getFabricante() { return fabricante; } } 5. Creando la clase java IPhone: Clic derecho en el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese IPhone Para el nombre del paquete (Packages), ingrese dominio Clic Finish.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 11
Curso: "Programacin Java SE" 2013
Observe que se crea la clase IPhone.java y es desplegada en el editor de cdigo del IDE. Modifique la clase IPhone.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Electronico, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
/** * * @author Andrs Guzmn */ public class IPhone extends Electronico {
@Override public double getPrecioVenta() { return getPrecio() * 0.9; }
public String getModelo() { return modelo; }
public String getColor() { return color; } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 12
Curso: "Programacin Java SE" 2013
6. Creando la clase java TvLcd: Clic derecho en el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese TvLcd Para el nombre del paquete (Packages), ingrese dominio Clic Finish.
Observe que se crea la clase TvLcd.java y es desplegada en el editor de cdigo del IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 13
Curso: "Programacin Java SE" 2013
Modifique la clase TvLcd.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Electronico, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
/** * @author Andrs Guzmn */ public class TvLcd extends Electronico {
private int pulgada;
public TvLcd(int precio, String fabricante, int pulgada) { super(precio, fabricante);
this.pulgada = pulgada;
}
@Override public double getPrecioVenta() { return getPrecio() * 0.8; }
public int getPulgada() { return pulgada; } }
7. Creando la clase java Libro: Clic derecho en el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Libro Para el nombre del paquete (Packages), ingrese dominio Clic Finish. AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 14
Curso: "Programacin Java SE" 2013
Observe que se crea la clase Libro.java y es desplegada en el editor de cdigo del IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 15
Curso: "Programacin Java SE" 2013
Modifique la clase Libro.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Producto, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
import java.util.Date;
/** * * @author Andrs Guzmn */ public class Libro extends Producto {
private Date fechaPublicacion = new Date(); private String autor; private String titulo; private String editorial;
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 16
Curso: "Programacin Java SE" 2013
8. Creando la clase java Comics: Clic derecho en el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Comics Para el nombre del paquete (Packages), ingrese dominio Clic Finish.
Observe que se crea la clase Comics.java y es desplegada en el editor de cdigo del IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 17
Curso: "Programacin Java SE" 2013
Modifique la clase Comics.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Libro, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
/** * * @author Andrs Guzmn */ public class Comics extends Libro {
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 18
Curso: "Programacin Java SE" 2013
9. Modificar el contenido generado por el IDE en la clase EjemploCatalogo.java. Modifique la clase EjemploCatalogo.java como se muestra en el Cdigo de abajo, poner especial atencin en los comentarios resaltados con negrita. import dominio.Comics; import dominio.Electronico; import dominio.IPhone; import dominio.Libro; import dominio.Producto; import dominio.TvLcd;
public class EjemploCatalogo { public static void main(String[] args) {
// Creamos un arreglo de 6 Productos Producto[] productos = new Producto[6];
// Creamos 6 objetos del tipo Producto (clase abstracta) // y las asignamos al arreglo productos[0] = new IPhone(299000, "Apple", "3G", "Negro"); productos[1] = new IPhone(399000, "Apple", "4G", "Blanco"); productos[2] = new TvLcd(340000, "Sony", 40); productos[3] = new Libro(18000, "Eric Gamma", "Elementos reusables POO", "Alguna..."); productos[4] = new Libro(14000, "Martin Fowler", "UML Gota a Gota", "Alguna..."); productos[5] = new Comics(5000, "Pepo", "Condorito", "Alguna...", "Condorito");
// Para los Electronicos ============ if (producto instanceof Electronico) { System.out.print(" - "); System.out.print("Fabricante: " + ((Electronico) producto).getFabricante());
// Para los IPhone ============ if (producto instanceof IPhone) { System.out.print(" - "); System.out.print("Modelo: " + ((IPhone) producto).getModelo()); System.out.print(" - "); System.out.print("Color: " + ((IPhone) producto).getColor()); }
// Para los LCD ============ if (producto instanceof TvLcd) { System.out.print(" - "); System.out.print("Pulgadas: " + ((TvLcd) producto).getPulgada()); } }
// Para los Libros ============ if (producto instanceof Libro) { System.out.print(" - "); AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 19
// Para los Comics ============ if (producto instanceof Comics) { System.out.print(" - "); System.out.print("Personaje: " + ((Comics) producto).getPersonaje()); }
}
System.out.println(); } } }
10. Construir y ejecutar el programa Clic derecho del mouse sobre el proyecto ProyectoCatalogoUsandoClaseAbstracta y seleccionar Run Observe el resultado en la salida de consola (Tab Output):
run: Tipo de: dominio.IPhone - Precio: 299000 - Precio final: 269100.0 - Fabricante: Apple - Modelo: 3G - Color: Negro Tipo de: dominio.IPhone - Precio: 399000 - Precio final: 359100.0 - Fabricante: Apple - Modelo: 4G - Color: Blanco Tipo de: dominio.TvLcd - Precio: 340000 - Precio final: 272000.0 - Fabricante: Sony - Pulgadas: 40 Tipo de: dominio.Libro - Precio: 18000 - Precio final: 17100.0 - Titulo: Elementos reusables POO - Autor: Eric Gamma Tipo de: dominio.Libro - Precio: 14000 - Precio final: 13300.0 - Titulo: UML Gota a Gota - Autor: Martin Fowler Tipo de: dominio.Comics - Precio: 5000 - Precio final: 4250.0 - Titulo: Condorito - Autor: Pepo - Personaje: Condorito BUILD SUCCESSFUL (total time: 2 seconds) AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 20
Curso: "Programacin Java SE" 2013
Ejercicio 2: Crear una aplicacin para un catlogo de productos usando interfaces. Un interface es una coleccin de definiciones de mtodos (sin implementaciones) y de valores constantes. Interfaz es como una clase abstracta pero no permite que ninguno de sus mtodos est implementado. Se declaran sustituyendo class por interface. Los interfaces se utilizan para definir un protocolo de comportamiento que puede ser implementado por cualquier clase del rbol de clases. Capturar similitudes entre clases no relacionadas sin forzar una relacin entre ellas. Declarar mtodos que una o varias clases necesitan implementar. En Java, un interface es un tipo de dato de referencia, y por tanto, puede utilizarse en muchos de los sitios donde se pueda utilizar cualquier tipo (como en un argumento de mtodos y una declaracin de variables, llamado control de tipo) Las herencias de clases definen el "qu son" y las de interfaces agrupan clases que definen el "qu hacen", es decir las interfaces describen algunas de las caractersticas de una clase. Cuando agrupamos por herencia hay una relacin de parentesco, pero con las interfaces agrupamos objetos que "hacen cosas similares" como una interfaz "imprimible" que todos nuestros objetos debieran de implementar para poder pasar por la impresora (les estamos diciendo de alguna forma que deben cumplir con un "contrato de implementacin" para poder ser "imprimibles"). Por convencin, los nombres de interfaces empiezan con una letra mayscula al igual que las clases. Frecuentemente los nombres de interfaces terminan en "able" o "ible". Una declaracin de interface puede tener otros dos componentes: el especificador de acceso public y una lista de "superinterfaces". Una interface sirve para establecer un 'protocolo' entre clases. Todos los mtodos que declara una interface son siempre public o default.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 21
Curso: "Programacin Java SE" 2013
1. Abrir Netbeans IDE 2. Crear un proyecto Netbeans: Java Application Seleccionar File desde el men superior y seleccionar New Project. Observar que aparece la ventana de dialogo New Project. Seleccionar Java bajo Categories, y Seleccionar Java Application bajo la seccin Projects. Clic Next.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 22
Curso: "Programacin Java SE" 2013
Bajo el panel Name and Location, para el Nombre del Proyecto (Project Name), ingrese ProyectoCatalogoUsandoInterface. Este es el nombre que se le dar al proyecto. Para el campo Create Main Class, ingresar EjemploCatalogo. (Figura de abajo) Esto es para generar la clase autnoma EjemploCatalogo.java, que contendr el mtodo main(..) que ser generado por Netbeans. Clic Finish Observe que el proyecto ProyectoCatalogoUsandoInterface y ha sido creado bajo la pestaa Projects de NetBeans IDE y adems ha generado automticamente la clase EjemploCatalogo.java la cual es desplegada en el editor de cdigo del IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 23
Curso: "Programacin Java SE" 2013
3. Creando la interface java IProducto: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Interface.
Observe que aparece la ventana para crear una clase Java: New Java Inteface Para el nombre de la case (Class Name), ingrese IProducto Para el nombre del paquete (Packages), ingrese dominio Clic Finish. AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 24
Curso: "Programacin Java SE" 2013
Observe que se crea la interface IProducto.java y es desplegada en el editor de cdigo del IDE. 4. Modifique la interface IProducto.java como se muestra en el Cdigo de abajo, poner especial atencin en la palabra reservada interface, en los mtodo sin declarar de la interface getPrecioVenta() y getPrecio(). package dominio;
/** * * @author Andrs Guzmn */ public interface IProducto { //Mtodos sin implementar de la interface, las clase que la implementan deben implementar stos mtodos public int getPrecio();
public double getPrecioVenta(); }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 25
Curso: "Programacin Java SE" 2013
5. Creando la interface java IElectronico: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Interface.
Observe que aparece la ventana para crear una clase Java: New Java Inteface Para el nombre de la case (Class Name), ingrese IElectronico Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la interface IElectronico.java y es desplegada en el editor de cdigo del IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 26
Curso: "Programacin Java SE" 2013
6. Modifique la interface IElectronico.java como se muestra en el Cdigo de abajo, poner especial atencin en la palabra reservada interface, en los mtodo sin declarar de la interface getFabricante (), observe que tambin hereda de la interface IProducto (una interface puede heredar de otra interface, como en las clases, en ste caso para reutilizar comportamientos). package dominio;
7. Creando la interface java ILibro: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Interface.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 27
Curso: "Programacin Java SE" 2013
Observe que aparece la ventana para crear una clase Java: New Java Inteface Para el nombre de la case (Class Name), ingrese ILibro Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la interface ILibro.java y es desplegada en el editor de cdigo del IDE. 8. Modifique la interface ILibro.java como se muestra en el Cdigo de abajo, poner especial atencin en la palabra reservada interface, en los mtodos sin declarar de la interface, y note que adems hereda de la interface IProducto. package dominio;
import java.util.Date;
/** * * @author Andrs Guzmn */ public interface ILibro extends IProducto{ public Date getFechaPublicacion();
public String getAutor();
public String getTitulo();
public String getEditorial(); }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 28
Curso: "Programacin Java SE" 2013
9. Creando la clase java Producto: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Class.
Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Producto Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Producto.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Producto.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin de la interface IProducto.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 29
Curso: "Programacin Java SE" 2013
package dominio;
/** * * @author Andrs Guzmn */ public class Producto implements IProducto{
private int precio;
public Producto(int precio) { this.precio = precio; }
public int getPrecio() { return precio; }
// Implementa el mtodo de la interfaz IProducto public double getPrecioVenta(){ return 0; } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 30
Curso: "Programacin Java SE" 2013
11. Creando la clase java Electronico: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Electronico Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Electronico.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Electronico.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin (implements) de la interface IElectronico, el extends de Producto y en el atributo fabricante con sus respectivos mtodos getter/setter y en el constructor.
package dominio;
/** * * @author Andrs Guzmn */ public class Electronico extends Producto implements IElectronico{
private String fabricante;
public Electronico(int precio, String fabricante) {
super(precio); this.fabricante = fabricante; }
public String getFabricante() { return fabricante; } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 31
Curso: "Programacin Java SE" 2013
12. Creando la clase java IPhone: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese IPhone Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase IPhone.java y es desplegada en el editor de cdigo del IDE. Modifique la clase IPhone.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Electronico, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
/** * * @author Andrs Guzmn */ public class IPhone extends Electronico {
@Override public double getPrecioVenta() { return getPrecio() * 0.9; }
public String getModelo() { return modelo; }
public String getColor() { return color; } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 32
Curso: "Programacin Java SE" 2013
13. Creando la clase java TvLcd: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese TvLcd Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase TvLcd.java y es desplegada en el editor de cdigo del IDE. Modifique la clase TvLcd.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Electronico, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
/** * @author Andrs Guzmn */ public class TvLcd extends Electronico {
private int pulgada;
public TvLcd(int precio, String fabricante, int pulgada) { super(precio, fabricante);
this.pulgada = pulgada;
}
@Override public double getPrecioVenta() { return getPrecio() * 0.8; }
public int getPulgada() { return pulgada; } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 33
Curso: "Programacin Java SE" 2013
14. Creando la clase java Libro: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Libro Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Libro.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Libro.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin de la interface (implements) ILibro, en el extends de Producto, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio; import java.util.Date;
/** * @author Andrs Guzmn */ public class Libro extends Producto implements ILibro { private Date fechaPublicacion = new Date(); private String autor; private String titulo; private String editorial;
15. Creando la clase java Comics: Clic derecho en el proyecto ProyectoCatalogoUsandoInterface y seleccionamos New- >Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Comics Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Comics.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Comics.java como se muestra en el Cdigo de abajo, poner especial atencin en el extends de Libro, en el mtodo que sobre-escribe/implementa getPrecioVenta() y en sus atributos con sus respectivos mtodos getter/setter y en el constructor. package dominio;
/** * * @author Andrs Guzmn */ public class Comics extends Libro {
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 35
Curso: "Programacin Java SE" 2013
16. Modificar el contenido generado por el IDE en la clase EjemploCatalogo.java. Modifique la clase EjemploCatalogo.java como se muestra en el Cdigo de abajo, poner especial atencin en los comentarios resaltados con negrita. import dominio.Comics; import dominio.IElectronico; import dominio.ILibro; import dominio.IPhone; import dominio.IProducto; import dominio.Libro; import dominio.TvLcd;
public class EjemploCatalogo { public static void main(String[] args) {
// Creamos un arreglo de 6 Productos del tipo de la interface IProducto IProducto[] productos = new IProducto[6];
// Creamos 6 objetos del tipo IProducto (De la interface) // y las asignamos al arreglo productos[0] = new IPhone(299000, "Apple", "3G", "Negro"); productos[1] = new IPhone(399000, "Apple", "4G", "Blanco"); productos[2] = new TvLcd(340000, "Sony", 40); productos[3] = new Libro(18000, "Eric Gamma", "Elementos reusables POO", "Alguna..."); productos[4] = new Libro(14000, "Martin Fowler", "UML Gota a Gota", "Alguna..."); productos[5] = new Comics(5000, "Pepo", "Condorito", "Alguna...", "Condorito");
// Para los Electronicos ============ if (producto instanceof IElectronico) { System.out.print(" - "); System.out.print("Fabricante: " + ((IElectronico) producto).getFabricante());
// Para los IPhone ============ if (producto instanceof IPhone) { System.out.print(" - "); System.out.print("Modelo: " + ((IPhone) producto).getModelo()); System.out.print(" - "); System.out.print("Color: " + ((IPhone) producto).getColor()); }
// Para los LCD ============ if (producto instanceof TvLcd) { System.out.print(" - "); System.out.print("Pulgadas: " + ((TvLcd) producto).getPulgada()); } }
// Para los Libros ============ if (producto instanceof ILibro) { AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 36
// Para los Comics ============ if (producto instanceof Comics) { System.out.print(" - "); System.out.print("Personaje: " + ((Comics) producto).getPersonaje()); }
}
System.out.println(); } } }
17. Construir y ejecutar el programa Clic derecho del mouse sobre el proyecto ProyectoCatalogoUsandoInterface y seleccionar Run Observe el resultado en la salida de consola (Tab Output):
run: Tipo de: dominio.IPhone - Precio: 299000 - Precio final: 269100.0 - Fabricante: Apple - Modelo: 3G - Color: Negro Tipo de: dominio.IPhone - Precio: 399000 - Precio final: 359100.0 - Fabricante: Apple - Modelo: 4G - Color: Blanco Tipo de: dominio.TvLcd - Precio: 340000 - Precio final: 272000.0 - Fabricante: Sony - Pulgadas: 40 Tipo de: dominio.Libro - Precio: 18000 - Precio final: 17100.0 - Titulo: Elementos reusables POO - Autor: Eric Gamma Tipo de: dominio.Libro - Precio: 14000 - Precio final: 13300.0 - Titulo: UML Gota a Gota - Autor: Martin Fowler Tipo de: dominio.Comics - Precio: 5000 - Precio final: 4250.0 - Titulo: Condorito - Autor: Pepo - Personaje: Condorito BUILD SUCCESSFUL (total time: 0 seconds) AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 37
Curso: "Programacin Java SE" 2013
Ejercicio 2: Crear un programa de Imprenta usando interfaces. Contexto, el problema y la solucin Por ejemplo una clase Hoja que tendra toda la informacin base para cualquier documento que quiera imprimirse. Por defecto la hoja sabe imprimirse, y en caso de necesitar modificar el comportamiento, sobre-escribiremos el mtodo imprime en la clase concreta (Currculum, contrato o Informe). Ahora bien, el diseo se nos complicara si queremos poder imprimir cosas que no necesariamente son Hojas, como un Libro, una revista, una etiqueta, un pendn, incluso una polera, etc. Qu hacemos? Creamos tantas impresoras como temas distintos enfrentemos? Siguiendo el problema anterior, ahora tenemos varios tipos de elementos que no necesariamente son simples hojas. Hasta ahora venamos bien, pero si entendimos todo lo expuesto anteriormente, no podemos modificar la herencia para que un Libro sea hijo de Hoja (incorrecto), o que la Impresora ahora controle libros y que todo herede de Libro (incorrecto), o todas las variantes que se nos ocurran el problema es que la herencia no cubre estos casos, la herencia solo se aplica cuando hay parentesco, si no lo hay, no sirve a menos que usemos las interfaces!
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 38
Curso: "Programacin Java SE" 2013
1. Abrir Netbeans IDE 2. Crear un proyecto Netbeans: Java Application Seleccionar File desde el men superior y seleccionar New Project. Observar que aparece la ventana de dialogo New Project. Seleccionar Java bajo Categories, y Seleccionar Java Application bajo la seccin Projects. Clic Next.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 39
Curso: "Programacin Java SE" 2013
Bajo el panel Name and Location, para el Nombre del Proyecto (Project Name), ingrese ProyectoImprenta. Este es el nombre que se le dar al proyecto. Para el campo Create Main Class, ingresar EjemploImprenta. (Figura de abajo) Esto es para generar la clase autnoma EjemploCatalogo.java. Clic Finish Observe que el proyecto EjemploImprenta y ha sido creado bajo la pestaa Projects de NetBeans IDE.
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 40
Curso: "Programacin Java SE" 2013
3. Creando la interface java Imprimible: Clic derecho en el proyecto ProyectoImprenta y seleccionamos New->Java Interface. Observe que aparece la ventana para crear una clase Java: New Java Inteface Para el nombre de la case (Class Name), ingrese Imprimible Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la interface Imprimible.java y es desplegada en el editor de cdigo del IDE. 4. Modifique la interface Imprimible.java como se muestra en el Cdigo de abajo, poner especial atencin en la palabra reservada interface, en el mtodo imprimir() sin declarar de la interface. package dominio;
/** * * @author Andrs Guzmn F */ public interface Imprimible {
public String imprimir(); }
5. Creando la clase java abstracta Hoja: Clic derecho en el proyecto ProyectoImprenta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Hoja Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Hoja.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Hoja.java como se muestra en el Cdigo de abajo, poner especial atencin en el modificador abstract y en el mtodo abstracto, cualquier objeto del tipo hoja deber heredar de Hoja, tales como Informe, Currculo, Fotografa, Pgina etc. package dominio; /** * @author Andrs Guzmn F */ public abstract class Hoja {
protected String contenido;
public Hoja(String contenido) { this.contenido = contenido; } public abstract String imprimir(); }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 41
Curso: "Programacin Java SE" 2013
6. Creando la clase java Informe: Clic derecho en el proyecto ProyectoImprenta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Informe Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Informe.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Informe.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin (implements) de la interface Imprimible, y en el extends de Hoja (Es un tipo de Hoja y adems debe cumplir el contrato de la interfaz Imprimible). Observe que implementa el mtodo imprimir() de la Interfaz Imprimible
package dominio;
/** * * @author Andrs Guzmn F */ public class Informe extends Hoja implements Imprimible {
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 42
Curso: "Programacin Java SE" 2013
7. Creando la clase java Curriculo: Clic derecho en el proyecto ProyectoImprenta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Curriculo Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Curriculo.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Curriculo.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin (implements) de la interface Imprimible, y en el extends de Hoja (Es un tipo de Hoja y adems debe cumplir el contrato de la interfaz Imprimible). Observe que implementa el mtodo imprimir() de la Interfaz Imprimible package dominio; import java.util.ArrayList; import java.util.List; /** * @author Andrs Guzmn F */ public class Curriculo extends Hoja implements Imprimible {
8. Creando la clase java Libro: Clic derecho en el proyecto ProyectoImprenta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Libro Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Libro.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Libro.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin (implements) de la interface Imprimible. Observe que el libro est compuesto (atributo List) por Paginas que a su vez stas tambin son imprimibles, atributo paginas. package dominio;
for (Imprimible pagina : paginas) { sb.append(pagina.imprimir()).append("\n"); }
return sb.toString(); } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 44
Curso: "Programacin Java SE" 2013
9. Creando la clase java Pagina: Clic derecho en el proyecto ProyectoImprenta y seleccionamos New->Java Class. Observe que aparece la ventana para crear una clase Java: New Java Class Para el nombre de la case (Class Name), ingrese Pagina Para el nombre del paquete (Packages), ingrese dominio Clic Finish. Observe que se crea la clase Pagina.java y es desplegada en el editor de cdigo del IDE. Modifique la clase Pagina.java como se muestra en el Cdigo de abajo, poner especial atencin en la implementacin (implements) de la interface Imprimible, y en el extends de Hoja (Es un tipo de Hoja y adems debe cumplir el contrato de la interfaz Imprimible) y un componente de la clase Libro. Observe que implementa el mtodo imprimir() de la Interfaz Imprimible package dominio;
/** * * @author Andrs Guzmn F */ public class Pagina extends Hoja implements Imprimible {
public Pagina(String contenido) { super(contenido); }
@Override public String imprimir() { return contenido; } }
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 45
Curso: "Programacin Java SE" 2013
10. Modificar el contenido generado por el IDE en la clase EjemploImprenta.java. Modifique la clase EjemploImprenta.java como se muestra en el Cdigo de abajo, y estudie el cdigo. import dominio.Curriculo; import dominio.Imprimible; import dominio.Informe; import dominio.Libro; import dominio.Pagina;
/** * * @author Andrs Guzmn F */ public class EjemploImprenta {
public void imprimir(Imprimible imprimible) { System.out.println(imprimible.imprimir()); }
public static void main(String[] args) { EjemploImprenta imp = new EjemploImprenta();
Imprimible cv = new Curriculo("Resumen de Curriculum", "John Doe", "Analista");
Imprimible informe = new Informe("Estudio de suelo", "Bill", "Linus");
Libro libro = new Libro("Erich Gamma", "Patrones de diseos: Elem. Reusables POO"); libro.addPagina(new Pagina("Patrn Singleton")); libro.addPagina(new Pagina("Patrn Observador")); libro.addPagina(new Pagina("Patrn Factory")); libro.addPagina(new Pagina("Patrn Decorator")); libro.addPagina(new Pagina("Patrn Fascade"));
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 46
Curso: "Programacin Java SE" 2013
11. Construir y ejecutar el programa Clic derecho del mouse sobre el proyecto ProyectoImprenta y seleccionar Run Observe el resultado en la salida de consola (Tab Output):
run: Nombre: John Doe Resumen: Resumen de Curriculum Profesin: Analista Experiencias: Oracle EJB3 Spring Framework ESB Struts 2
Informe escrito por: Linus Revisado por: Bill Estudio de suelo Titulo: Patrones de diseos: Elem. Reusables POO Autor: Erich Gamma Patrn Singleton Patrn Observador Patrn Factory Patrn Decorator Patrn Fascade
En esta prctica de laboratorio vimos y estudiamos a profundidad con diversos ejemplos los conceptos que hay detrs del polimorfismo implementado con clases abstractas e interfaces.
Enva tus consultas a los foros! Aqu es cuando debes sacarte todas las dudas haciendo consultas en los foros correspondientes AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 48