Você está na página 1de 0

Curso: "Programacin Java SE" 2013

POO: Polimorfismo con Clase Abstracta e


Interface
Mdulo 5 / parte 2

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 {

private String modelo;
private String color;

public IPhone(int precio, String fabricante, String modelo, String color) {
super(precio, fabricante);

this.modelo = modelo;
this.color = color;
}

@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;

public Libro(int precio, String autor, String titulo, String editorial) {
super(precio);

this.autor = autor;
this.titulo = titulo;
this.editorial = editorial;
}

public Date getFechaPublicacion() {
return fechaPublicacion;
}

public String getAutor() {
return autor;
}

public String getTitulo() {
return titulo;
}

public String getEditorial() {
return editorial;
}

@Override
public double getPrecioVenta() {
return getPrecio() * 0.95;
}
}

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 {

private String personaje;

public Comics(int precio, String autor, String titulo, String editorial, String personaje) {
super(precio, autor, titulo, editorial);

this.personaje = personaje;
}

public String getPersonaje() {
return personaje;
}

@Override
public double getPrecioVenta() {
return this.getPrecio() * 0.85;
}
}

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");

for (Producto producto : productos) {

System.out.print("Tipo de: " + producto.getClass().getName());
System.out.print(" - ");
System.out.print("Precio: " + producto.getPrecio());
System.out.print(" - ");
System.out.print("Precio final: " + producto.getPrecioVenta());

// 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

Curso: "Programacin Java SE" 2013

System.out.print("Titulo: " + ((Libro) producto).getTitulo());
System.out.print(" - ");
System.out.print("Autor: " + ((Libro) producto).getAutor());

// 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;

/**
*
* @author Andrs Guzmn
*/
public interface IElectronico extends IProducto {

public String getFabricante();
}

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 {

private String modelo;
private String color;

public IPhone(int precio, String fabricante, String modelo, String color) {
super(precio, fabricante);

this.modelo = modelo;
this.color = color;
}

@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;

public Libro(int precio, String autor, String titulo, String editorial) {
super(precio);
this.autor = autor;
this.titulo = titulo;
this.editorial = editorial;
}

public Date getFechaPublicacion() {
return fechaPublicacion;
}

public String getAutor() {
return autor;
}

public String getTitulo() {
return titulo;
}

public String getEditorial() {
return editorial;
}

@Override
public double getPrecioVenta() {
return getPrecio() * 0.95;
}
}
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 34

Curso: "Programacin Java SE" 2013

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 {

private String personaje;

public Comics(int precio, String autor, String titulo, String editorial, String personaje) {
super(precio, autor, titulo, editorial);

this.personaje = personaje;
}

public String getPersonaje() {
return personaje;
}

@Override
public double getPrecioVenta() {
return this.getPrecio() * 0.85;
}
}

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");

for (IProducto producto : productos) {

System.out.print("Tipo de: " + producto.getClass().getName());
System.out.print(" - ");
System.out.print("Precio: " + producto.getPrecio());
System.out.print(" - ");
System.out.print("Precio final: " + producto.getPrecioVenta());

// 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

Curso: "Programacin Java SE" 2013

System.out.print(" - ");
System.out.print("Titulo: " + ((ILibro) producto).getTitulo());
System.out.print(" - ");
System.out.print("Autor: " + ((ILibro) producto).getAutor());

// 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 {

private String revisor;
private String autor;

public Informe(String contenido, String revisor, String autor) {
super(contenido);
this.revisor = revisor;
this.autor = autor;
}

@Override
public String imprimir() {
return "Informe escrito por: " + autor + " Revisado por: " + revisor + "\n" + contenido;
}
}


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 {

private String persona;
private String carrera;
private List<String> experiencias = new ArrayList<String>();

public Curriculo(String contenido, String persona, String carrera) {
super(contenido);

this.persona = persona;
this.carrera = carrera;
}

public void addExperiencia(String exp) {
experiencias.add(exp);
}

@Override
public String imprimir() {

StringBuilder str = new StringBuilder();

str.append("Nombre: ").append(persona).append("\n").append("Resumen:
").append(contenido).append("\n").append("Profesin: ").append(carrera).append("\n").append("Experiencias: ");

for (String exp : experiencias) {
str.append(exp).append("\n");
}

return str.toString();
}
}
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 43

Curso: "Programacin Java SE" 2013

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;

/**
* @author Andrs Guzmn F
*/
import java.util.ArrayList;
import java.util.List;

public class Libro implements Imprimible {

private String autor;
private String titulo;
private List<Imprimible> paginas = new ArrayList<Imprimible>();

public Libro(String autor, String titulo) {
this.autor = autor;
this.titulo = titulo;
}

public void addPagina(Imprimible pagina) {
paginas.add(pagina);
}

@Override
public String imprimir() {
StringBuilder sb = new StringBuilder();

sb.append("Titulo: ").append(titulo).append("\n").append("Autor: ").append(autor).append("\n");

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"));

((Curriculo) cv).addExperiencia(new String("Oracle"));
((Curriculo) cv).addExperiencia(new String("EJB3"));
((Curriculo) cv).addExperiencia(new String("Spring Framework"));
((Curriculo) cv).addExperiencia(new String("ESB"));
((Curriculo) cv).addExperiencia(new String("Struts 2"));

imp.imprimir(cv);
imp.imprimir(informe);
imp.imprimir(libro);
}
}


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

BUILD SUCCESSFUL (total time: 0 seconds)
AUTORES: andresguzf@gmail.com WEB: http://formacion-java.bolsadeideas.cl | | Abstracta e Interface 47

Curso: "Programacin Java SE" 2013

Resumen

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

Você também pode gostar