You are on page 1of 11

Herencia y Polimorfismo en Java (Ejemplo 01)

Enunciado: La empresa XYZ requiere una aplicacin informtica para administrar los datos
de su personal.
Del personal se conoce: nmero de DNI, nombre, apellidos y fecha de ingreso.
Existen dos categoras de personal: el personal contratado y el personal a destajo. Los
empleados contratados tienen un sueldo bsico y un porcentaje adicional en funcin al tiempo
laborado: de 0 a 3 aos: 5%; de 4 a 7 aos: 10%; de 8 a 15 aos: 15% y ms de 15 aos:
20%. Los empleados a destajo tienen un nmero de clientes captados y un monto por cliente
captado.
El desarrollo se compone de 3 paquetes: datos, entidades y presentacion.
En el paquete datos se encuentra una clase llamada ListaEmpleados.
Dentro de entidades tenemos la clase padre Empleado de la que heredan las
clases EContratado y EDestajo.
Finalmente, el paquete presentacion incluye las clases: Aplication y AplicationRunner.
El video explicativo de este ejercicio (que hace uso de Herencia y Polimorfismo) puede verse
desde la siguiente direccin:

Enlace: https://www.youtube.com/watch?v=2tO_v8gYk74

Y el cdigo fuente de cada una de las clases mencionadas se presenta a continuacin.

Clase Empleado

package entidades;

public class Empleado {
private String dni;
private String nombre;
private String apellidos;
protected java.util.GregorianCalendar fechaIngreso;

public Empleado () {
dni = "00000000";
nombre = "NN";
apellidos = "NA";
fechaIngreso = new java.util.GregorianCalendar(1800,0,1);
}

public Empleado (String dni, String nombre, String apellidos,
java.util.GregorianCalendar fechaIngreso) {
this.dni = dni;
this.nombre = nombre;
this.apellidos = apellidos;
this.fechaIngreso = fechaIngreso;
}

public void setDni (String dni) {
this.dni = dni;
}

public String getDni () {
return dni;
}

public void setNombre (String nombre) {
this.nombre = nombre;
}

public String getNombre () {
return nombre;
}

public void setApellidos (String apellidos) {
this.apellidos = apellidos;
}

public String getApellidos () {
return apellidos;
}

public void setFechaIngreso (java.util.GregorianCalendar
fechaIngreso) {
this.fechaIngreso = fechaIngreso;
}

public java.util.GregorianCalendar getFechaIngreso () {
return fechaIngreso;
}

@Override
public String toString () {
int dia, mes, ao;
dia = getFechaIngreso().get(java.util.Calendar.DAY_OF_MONTH);
mes = getFechaIngreso().get(java.util.Calendar.MONTH)+1;
ao = getFechaIngreso().get(java.util.Calendar.YEAR);
return "DNI: " + getDni() + "\nNombre y Apellidos: " +
getNombre() +
" " + getApellidos() + "\nFecha de ingreso: " +
(dia<=9?"0"+dia:dia) + "/" + (mes<=9?"0"+mes:mes) + "/" +
ao;
}
}

Clase EContratado
package entidades;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class EContratado extends Empleado {
private float salarioB;

public EContratado () {
super();
salarioB = 0.0f;
}

public EContratado (String dni, String nombre, String apellidos,
java.util.GregorianCalendar fechaIngreso, float salarioB) {
super(dni, nombre, apellidos, fechaIngreso);
this.salarioB = salarioB;
}

public void setSalario (float salarioB) {
this.salarioB = salarioB;
}

public float getSalario () {
GregorianCalendar Actual = new GregorianCalendar();
int anios = Actual.get(Calendar.YEAR) -
fechaIngreso.get(Calendar.YEAR);
if(fechaIngreso.get(Calendar.MONTH)>Actual.get(Calendar.MONTH)
||
fechaIngreso.get(Calendar.MONTH)==Actual.get(Calendar.MONTH)
&&
fechaIngreso.get(Calendar.DAY_OF_MONTH)>Actual.get(Calendar.DAY_OF_MONTH)
) anios--;
switch(anios)
{
case 0: // break;
case 1:
case 2:
case 3: return 1.05f*salarioB;
case 4:
case 5:
case 6:
case 7: return 1.10f*salarioB;
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15: return 1.15f*salarioB;
default: return 1.20f*salarioB;
}
}

@Override
public String toString () {
return super.toString() + "\nSalario: " + getSalario();
}
}

Clase EDestajo
package entidades;

public class EDestajo extends Empleado {
private int clientesCaptados;
public static final float salarioD = 130.05f;

public EDestajo () {
super();
clientesCaptados = 0;
}

public EDestajo (String dni, String nombre, String apellidos,
java.util.GregorianCalendar fechaIngreso, int clientesCaptados) {
super(dni, nombre, apellidos, fechaIngreso);
this.clientesCaptados = clientesCaptados;
}

public void setClientesCaptados (int clientesCaptados) {
this.clientesCaptados = clientesCaptados;
}

public int getClientesCaptados () {
return clientesCaptados;
}

public float getSalario () {
return salarioD*clientesCaptados;
}

@Override
public String toString () {
return super.toString() + "\nSalario: " + getSalario();
}
}

Clase ListaEmpleados
package datos;

import entidades.Empleado;
import java.util.ArrayList;

public class ListaEmpleados {
private ArrayList listaE;
private int posicion; // ltima posicin.

public ListaEmpleados () {
listaE = new ArrayList();
posicion = -1;
}

public void addEmpleado (Empleado empleado) {
listaE.add(empleado);
++posicion;
}

public Empleado getEmpleado (int pos) {
if(pos>=0 && pos<=posicion)
return listaE.get(pos);
return null;
}

public int getPosicion () {
return posicion;
}

@Override
public String toString () {
String cadena = "";
for(int i=0; i<=posicion; i++)
cadena += "\n\tEmpleado " + (i+1) + ":\n" + listaE.get(i);
return cadena;
}
}

Clase Aplication
/*
* Menu de opciones:
* 1. Registrar empleados contratados
* 2. Registrar empleados a destajo
* 3. Mostrar salarios por empleado
* 4. Salir
*/

package presentacion;

import datos.ListaEmpleados;
import entidades.*;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class Aplication {

int opt;
ListaEmpleados ListaContratados = new ListaEmpleados();
ListaEmpleados ListaDestajos = new ListaEmpleados();
private static Scanner Lector = new Scanner(System.in);
public static final short CONTRATADO = 0;
public static final short POR_DESTAJO = 1;

private static String Leer(String msje)
{
System.out.print(msje+": ");
return Lector.nextLine();
}

private void Leer(int Type)
{
String dni = Leer("Ingrese su DNI");
String nombre = Leer("Ingrese su nombre");
String apellidos = Leer("Ingrese sus apellidos");
System.out.println("Ingrese fecha de ingreso:");
int anio = Integer.parseInt( Leer("Ao") );
int mes = Integer.parseInt( Leer("Mes (1-12)") );
int dia = Integer.parseInt( Leer("Da") );
GregorianCalendar fechaIngreso = new GregorianCalendar(anio,mes-
1,dia);

if(Type == CONTRATADO)
{
int salarioB = Integer.parseInt( Leer("Ingrese salario base")
);
ListaContratados.addEmpleado( new EContratado(dni, nombre,
apellidos, fechaIngreso, salarioB) );
}else{
int clientesObtenidos = Integer.parseInt( Leer("Ingrese
clientes reclutados") );
ListaDestajos.addEmpleado( new EDestajo(dni, nombre,
apellidos, fechaIngreso, clientesObtenidos) );
}
}

private void MostrarSalarios()
{
System.out.println("Salarios de los empleados contratados: ");
for(int i=0; i<=ListaContratados.getPosicion(); ++i)
System.out.println( ListaContratados.getEmpleado(i) );
System.out.println("Salarios de los empleados por destajo: ");
for(int i=0; i<=ListaDestajos.getPosicion(); ++i)
System.out.println( ListaDestajos.getEmpleado(i) );
}


private int Menu()
{
System.out.print(
"MENU DE OPCIONES\n"
+ "---- -- --------\n"
+ "1. Registrar empleados contratados.\n"
+ "2. Registrar empleados a destajo.\n"
+ "3. Mostrar salarios por empleado.\n"
+ "4. Salir.\n");
return Integer.parseInt( Leer("Seleccione opcin") );
}

private void Accionar(int opt)
{
switch(opt)
{
case 1:
Leer(CONTRATADO);
break;
case 2:
Leer(POR_DESTAJO);
break;
case 3:
MostrarSalarios();
break;
case 4:
System.out.println("Cerrando programa . . .");
break;
default:
System.err.println("Al menos ingresa una opcin vlida
._.");
}
}

public void Ejecutar () {

do{
opt = Menu();
Accionar(opt);
}while(opt!=4);

}
}

Clase AplicationRunner
package presentacion;

public class AplicationRunner {

public static void main(String[] args) {
new Aplication().Ejecutar();
}

}
El programa consiste en que si se introduce la contrasea y esta es correcta podra acceder a su
cuenta y al menu de opciones:
+++++++++++++Simulacion de Cajero+++++++++++
1.-Transferencia
2.-Retiro
3.-Consulta
El programa posee dos clases: Cuenta y Transferencia las cuales heredan de la clase padre
Clase_Polimorfismo la misma que es abstracta.
Ademas contiene una Interface: Interface la que contiene un solo metodo y una constante
declarada la misma que ya contiene su valor.
Sin dejar atras de la clase ejecutora la cual contiene manejo de excepciones para controlar los
digitos de la contrasea....
Clase Principal-Ejecutora del Programa

package Simula_Cajero;
import java.io.*;
public class Principal_Cajero {

public static InputStreamReader Leer = new InputStreamReader(System.in);
public static BufferedReader Teclado = new BufferedReader(Leer);
public static void main(String[] args) throws IOException {

Clase_Polimorfismo [] maru = new Clase_Polimorfismo[3];
maru[0] =new Cuenta (500,"Luis");
maru[1] =new Cuenta (700,"Xander");
maru[2] =new Cuenta (600,"Missael");

Clase_Polimorfismo [] leo = new Clase_Polimorfismo[3];
leo[0]= new Transferencia(0,"Luis");
leo[1]= new Transferencia(0,"Xander");
leo[2]= new Transferencia(0,"Missael");

int contr[]= new int [3];
contr[0]=1000;
contr[1]=2000;
contr[2]=3000;

int cta[]= new int[3];
cta[0]=100;
cta[1]=200;
cta[2]=300;

int m=0,l=0,q=0;
boolean falso=false;
do{
try{ falso=false;
do{
System.out.println(" INTRODUSCA SU CONTRASEA:");
int usuario=Integer.parseInt(Teclado.readLine());

if(usuario==contr[i]){
m=i;
System.out.println(" BIENVENIDO Al SISTEMA DE CAJERO AUTOMATICO ");
l=1;
q=2;
maru[i].Informacion();}}
if(l==0)
System.out.println(" CONTRASEA ERRONEA ");
if(q !=2){
System.out.println(" PRESIONE 1 PARA VOLVER");
q=Integer.parseInt(Teclado.readLine());

}}while(q==1);}
catch(NumberFormatException e ){falso=true;
System.out.println(" ERROR CONTRASEA INVALIDA"+"SOLO NUMERO "+e);
}}while(falso);
if(l==1){ int o;
do{
System.out.println("Que desea hacer:");
System.out.println("1.-Transferencia");
System.out.println("2.-Retiro");
System.out.println("3.-Consulta");
System.out.println("Ingrese opcion:");
o=Integer.parseInt(Teclado.readLine());
switch(o){
case 1:
boolean mar=false;
System.out.println(" INTRODUSCA EL NUMERO DE CUENTA");
int usuario=Integer.parseInt(Teclado.readLine());

if(usuario==cta[i]){mar=true;
System.out.println(" Introdusca la cantidad a Transferir:");
int cant=Integer.parseInt(Teclado.readLine());
int lu=maru[m].Saldo();
if(cant<=lu){
maru[m].Transferencia(cant);
leo[i].Transferencia(cant);
leo[i].Informacion();
}else System.out.println(" NO HAY SUFICIENTE DINERO");}}

if(mar==false){
System.out.println(" NUMERO DE CUENTA ERRONEO");}
maru[m].Informacion();
break;
case 2:
boolean my=false;
do{ my=false;
try{
System.out.println(" Introduzca la Cantidad a Retirar:");
int cant1=Integer.parseInt(Teclado.readLine());
if(cant1<=maru[m].Saldo()){
maru[m].Retiro(cant1);
}else System.out.println(" NO HAY SUFICIENTE DINERO PARA RETIRAR");
maru[m].Informacion();
}catch(NumberFormatException e ){my=true;
System.out.println(" ERROR"+"SOLO NUMERO "+e);
}}while(my);
break;
case 3:
System.out.println(" *************+BIENVENIDO +************* ");
maru[m].Informacion();
}
Clase Polimorfismo


package Simula_Cajero;
public abstract class Clase_Polimorfismo {
protected int sald;
protected String nom;

public Clase_Polimorfismo(int sald, String nom) {
this.sald = sald;
this.nom = nom;
}
public abstract int Saldo();
public abstract int Transferencia(int t);
public abstract void Retiro (int r);
public abstract void Informacion();
}
Clase Cuenta


package Simula_Cajero;
public class Cuenta extends Clase_Polimorfismo implements Interface {
public static int sald_ini=5;
public Cuenta(int sald, String nom) {
super(sald, nom);
}
@Override
public int Saldo() {
return this.sald;
}
@Override
public int Transferencia(int t) {
if(t>5){
int trans=(t*sald_ini)/100;
this.sald-=t+trans;}
else
System.out.println("No se puede Transferir menos de $5");
return this.sald;
}
@Override
public void Retiro(int r) {
if(r>5){
int re=(r*sald_ini)/100;
this.sald-=r+re;}else
System.out.println("No se puede Retirar menos de $5"); }
public int Consulta_Saldo() {
return this.sald;
}
@Override
public void Informacion() {
System.out.println("Hola:" +this.nom);
System.out.println("Su Saldo actual es:" +this.Consulta_Saldo()); }}
Interface

package Simula_Cajero;
public interface Interface {
public int Consulta_Saldo();
public int imp=2;
}
Clase Transferencia

package Simula_Cajero;
public class Transferencia extends Clase_Polimorfismo {
public static int sald_ini=5;
public Transferencia(int sald, String nom) {
super(sald, nom);
}
@Override
public void Retiro(int r) {
if(r >5){
int ret=(r*sald_ini)/100;
this.sald=r+ret;
}else
System.out.println("No se puede retirar menos del Saldo Inicial");}
@Override
public int Saldo() {
return this.sald;
}
@Override
public void Informacion() {
System.out.println("El Saldo Transferido es:" + this.sald);
}
@Override
public int Transferencia(int t) {
return this.sald+=t;
}}

You might also like