Duda ejercicio java

Iniciado por winnipu, 15 Noviembre 2013, 18:19 PM

0 Miembros y 1 Visitante están viendo este tema.

winnipu

Hola. Se me ha planteado el siguiente ejercicio en java, para trabajar con herencia y polimorfismo. En herencia voy mas o menos, pero polimorfismo estoy empezando. El enunciado es el siguiente:

Desarrollar una aplicación de control de llamadas realizadas en una centralita telefónica.


En la centralita se van registrando llamadas. Registrar una llamada consiste en contabilizar el número de llamadas realizadas así como el coste total de todas las llamadas realizadas.


La centralita mostrará por pantalla todas las llamadas según las vaya registrando.


Existen dos tipos de llamadas:


   Las llamadas locales que cuestan 15 céntimos el segundo.


   Y las llamadas provinciales que dependiendo de la franja horaria en la que se realicen cuestan: 20 céntimos en franja 1, 25 céntimos en franja 2 y 30 céntimos en franja 3, cada segundo.

Todas las llamadas tienen como datos el número origen de la llamada, el número destino y su duración en segundos.


Desarrollar la clase Actividad4 que en su método main cree una centralita, registre varias llamadas de distinto tipo y le pida a la centralita un informe con el número total de llamadas y la facturación total realizada.

He realizado el ejercicio del siguiente modo:

public class Centralita {

private int contador;
private double acumulado1;
private double acumulado2;
private double acumuladoTotal;

public int getTotalLlamadas(){
return contador;
}

public double getTotalFacturado(){
acumuladoTotal = acumulado1 + acumulado2;
return acumuladoTotal;
}

public double registrarLlamadaLocal(LlamadaLocal param){
contador += 1;
acumulado1 += param.costeLlamadaLocal();
return acumulado1;
}

public double registrarLlamadaProvincial(LlamadaProvincial param){
contador += 1;
acumulado2 = param.costeLlamadaP1() + param.costeLlamadaP2() + param.costeLlamadaP3();
return acumulado2;
}

public void imprimirTotalFacturado(){
System.out.println("El total facturado en llamadas es: " + getTotalFacturado());
System.out.println("El total de llamadas facturadas es: " + getTotalLlamadas());
}
}


public class Llamada {

private int numQueLlama;
private int numDestino;
private int segundosLlamada = 0;

public Llamada(){
}

public Llamada(int numQueLlama, int numDestino, int segundosLlamada){
this.numQueLlama = numQueLlama;
this.numDestino = numDestino;
this.segundosLlamada = segundosLlamada;
}

public void setNumQueLlama(int numQueLlama){
this.numQueLlama = numQueLlama;
}

public void setNumDestino(int numDestino){
this.numDestino = numDestino;
}

public void setSegundosLlamada(int segundosLlamada){
this.segundosLlamada = segundosLlamada;
}

public int getNumQueLlama(){
return numQueLlama;
}

public int getNumDestino(){
return numDestino;
}

public int getSegundosLlamada(){
return segundosLlamada;
}

public void imprimirNumOrigen(){
System.out.println("El numero que llama es: " + getNumQueLlama());
}

public void imprimirNumDestino(){
System.out.println("El numero al que se llama es: " + getNumDestino());
}

public void imprimirDuracionSegundos(){
System.out.println("La duracion en segundos de la llamada ha sido: " + getSegundosLlamada());
}

}


public class LlamadaLocal extends Llamada{

private double costeLocal = 0.15;

public LlamadaLocal(){
}

public LlamadaLocal(int numQueLlama, int numDestino, int segundosLlamada){
super(numQueLlama, numDestino, segundosLlamada);
}

public double costeLlamadaLocal(){
return (costeLocal * super.getSegundosLlamada());
}

public void imprimirCosteLlamadaLx(){
System.out.println("El coste total de la llamda local es: " + costeLlamadaLocal());
}

}


public class LlamadaProvincial extends Llamada{

private double costeProvincial1 = 0.20;
private double costeProvincial2 = 0.25;
private double costeProvincial3 = 0.30;
private int franja = 0;

public LlamadaProvincial(int numQueLlama, int numDestino, int segundosLlamada, int franja){
super(numQueLlama, numDestino, segundosLlamada);
this.franja = franja;
}
public double costeLlamadaP1(){
return(costeProvincial1 * super.getSegundosLlamada());
}

public double costeLlamadaP2(){
return(costeProvincial2 * super.getSegundosLlamada());
}

public double costeLlamadaP3(){
return(costeProvincial3 * super.getSegundosLlamada());
}

public void imprimirCosteLlamadaPx(){
switch (franja){
case 1: System.out.println("El coste total de la llamada provincial franja 1 es: " + costeLlamadaP1());
break;
case 2: System.out.println("El coste total de la llamada provincial franja 2 es: " + costeLlamadaP2());
break;
case 3: System.out.println("El coste total de la llamada provincial franja 3 es: " + costeLlamadaP3());
break;
default: System.out.println("No se introdujeron llamadas provinciales");
break;
}
}
}


public class Actividad4 {

public static void main(String[] args) {

Centralita c = new Centralita();
LlamadaLocal l1 = new LlamadaLocal (976776917, 976481651, 43);
LlamadaLocal l2 = new LlamadaLocal (976501641, 976125464, 93);
LlamadaProvincial p1 = new LlamadaProvincial (688124321, 976838781, 32, 1);
LlamadaProvincial p2 = new LlamadaProvincial (622233434, 976830865, 54, 3);




c.registrarLlamadaLocal(l1);
c.registrarLlamadaLocal(l2);
c.registrarLlamadaProvincial(p1);
c.registrarLlamadaProvincial(p2);
l1.imprimirNumOrigen();
l1.imprimirNumDestino();
l1.imprimirDuracionSegundos();
l1.imprimirCosteLlamadaLx();
l2.imprimirNumOrigen();
l2.imprimirNumDestino();
l2.imprimirDuracionSegundos();
l2.imprimirCosteLlamadaLx();
p1.imprimirNumOrigen();
p1.imprimirNumDestino();
p1.imprimirDuracionSegundos();
p1.imprimirCosteLlamadaPx();
p2.imprimirNumOrigen();
p2.imprimirNumDestino();
p2.imprimirDuracionSegundos();
p2.imprimirCosteLlamadaPx();
c.imprimirTotalFacturado();


}

}


El programa funciona pero me gustaria saber como mejorarlo usando una clase abstracta (Llamada) y llamandola desde la clase Centralita. Un saludo.

Mitsu

Hola. Lo más normal en casos como estos es hacer Llamada clase abstracta, y hacer que las clases LlamadaLocal y LlamadaPronvincial la extiendan. No necesitamos tener una instancta de Llamada, ya que es solo una abstracción, sus hijas LlamadaLocal y LlamadaProvincial son especializaciones de su padre.

Una clase abstracta no puede instanciarse. Cuando hacemos una clase abstracta el objetivo es 'abstraer' la idea general. Las especificaciones de ésta abstracción serán justamente sus hijas. En tu caso, yo haría Llamada Abstracta y dejaría que las hijas sean las que implementen las especificaciones.

winnipu

Gracias M1t$u. Voy a ver si lo logro, es la primera vez que trabajo con polimorfismo, pero asi se aprende.

winnipu

#3
Bueno creo que lo he logrado, si alguien ve mejora que lo diga, y sino aqui lo dejo por si le sirve a alguien:

public class Centralita {




private int numeroLlamadas;
private double costeLlamadas;

public Centralita(){

}


public Centralita(int numeroLlamadas, double costeLlamadas){
       this.numeroLlamadas= numeroLlamadas;
       this.costeLlamadas = costeLlamadas;
}

public int getNumeroLlamadas(){
       return numeroLlamadas;
}

public double getCosteLlamadas(){
       return costeLlamadas;
}

public void imprimirCosteTotalLlamadas(){
System.out.println("El coste total de las llamadas es: " + getCosteLlamadas());
}

public void numeroTotalLlamada(){
        System.out.println("El numero total de llamadas ha sido: " + getNumeroLlamadas());
}

public void registrarLlamadas(Llamada param){
       numeroLlamadas += 1;
       costeLlamadas += param.calcularPrecio();
}

}


abstract class Llamada {

private int numQueLlama;
private int numDestino;
private int segundosLlamada = 0;

public Llamada(){
}

public Llamada(int numQueLlama, int numDestino, int segundosLlamada){
this.numQueLlama = numQueLlama;
this.numDestino = numDestino;
this.segundosLlamada = segundosLlamada;
}

abstract double calcularPrecio();
abstract void imprimirCosteLlamada();

public void setNumQueLlama(int numQueLlama){
this.numQueLlama = numQueLlama;
}

public void setNumDestino(int numDestino){
this.numDestino = numDestino;
}

public void setSegundosLlamada(int segundosLlamada){
this.segundosLlamada = segundosLlamada;
}

public int getNumQueLlama(){
return numQueLlama;
}

public int getNumDestino(){
return numDestino;
}

public int getSegundosLlamada(){
return segundosLlamada;
}

public void imprimirNumOrigen(){
System.out.println("El numero que llama es: " + getNumQueLlama());
}

public void imprimirNumDestino(){
System.out.println("El numero al que se llama es: " + getNumDestino());
}

public void imprimirDuracionSegundos(){
System.out.println("La duracion en segundos de la llamada ha sido: " + getSegundosLlamada());
}

}


public class LlamadaLocal extends Llamada{

private double costeLocal = 0.15;

public LlamadaLocal(){
}

public LlamadaLocal(int numQueLlama, int numDestino, int segundosLlamada){
super(numQueLlama, numDestino, segundosLlamada);
}

public double calcularPrecio(){
return (costeLocal * super.getSegundosLlamada());
}


public void imprimirCosteLlamada(){
System.out.println("El coste total de la llamda local es: " + (costeLocal * super.getSegundosLlamada()));
}

}


public class LlamadaProvincial extends Llamada{

private double costeProvincial1 = 0.20;
private double costeProvincial2 = 0.25;
private double costeProvincial3 = 0.30;
private int franja = 0;

public LlamadaProvincial(int numQueLlama, int numDestino, int segundosLlamada, int franja){
super(numQueLlama, numDestino, segundosLlamada);
this.franja = franja;
}

public double calcularPrecio()
   {
           if (franja==1)
           {
                          return (super.getSegundosLlamada() * costeProvincial1);
           } else
                   if (franja==2)
                           {
                           return (super.getSegundosLlamada() * costeProvincial2);
                           }
                   else
                           return (super.getSegundosLlamada() * costeProvincial3);
           }

public void imprimirCosteLlamada(){
if (franja==1)
       {
                       System.out.println("El precio de la franja1 es: " + super.getSegundosLlamada() * costeProvincial1);
       } else
               if (franja==2)
                       {
                       System.out.println("El precio de la franja2 es: " + super.getSegundosLlamada() * costeProvincial2);
                       }
               else
                       System.out.println("El precio de la franja3 es: " + super.getSegundosLlamada() * costeProvincial3);
       }

}





public class Actividad4 {

public static void main(String[] args) {

Centralita c = new Centralita();
Llamada l1 = new LlamadaLocal (976776917, 976481651, 43);
Llamada l2 = new LlamadaLocal (976501641, 976125464, 93);
Llamada p1 = new LlamadaProvincial (688124321, 976838781, 32, 1);
Llamada p2 = new LlamadaProvincial (622233434, 976830865, 54, 3);



c.registrarLlamadas(l1);
c.registrarLlamadas(l2);
c.registrarLlamadas(p1);
c.registrarLlamadas(p2);
l1.imprimirNumOrigen();
l1.imprimirNumDestino();
l1.imprimirDuracionSegundos();
l1.imprimirCosteLlamada();
l2.imprimirNumOrigen();
l2.imprimirNumDestino();
l2.imprimirDuracionSegundos();
l2.imprimirCosteLlamada();
p1.imprimirNumOrigen();
p1.imprimirNumDestino();
p1.imprimirDuracionSegundos();
p1.imprimirCosteLlamada();
p2.imprimirNumOrigen();
p2.imprimirNumDestino();
p2.imprimirDuracionSegundos();
p2.imprimirCosteLlamada();
c.numeroTotalLlamada();
c.imprimirCosteTotalLlamadas();



}

Vint@ge

Mil Gracias por tu aporte... a mi me ha ayudado muchooo! =)

resakoso

Yo lo he resuelto creando una clase abstracta, por si a alguien le sirve...

//CLASE CENTRALITA

public class Centralita {

private int nLLamadas;
private double costeTotal;

public Centralita(){
nLLamadas=0;
costeTotal=0;
}

public int getNLLamadas(){
return nLLamadas;
}

public double getCosteLLamadas(){
return costeTotal;
}

public void registraLLamada(LLamada llamada){
nLLamadas++;
costeTotal+=llamada.costeLLamada();
}

public void printInforme (){
System.out.println("El nº total de llamadas es: "+nLLamadas+" y el coste total es: "+costeTotal);
}
}

//CLASE LLAMADA

public abstract class LLamada {

private String nOrigen;
private String nDestino;
private int duracion;

public LLamada(String nOr, String nDes, int dur){
nOrigen=nOr;
nDestino=nDes;
duracion=dur;
}
public int getDuracion(){
return duracion;
}
public abstract double costeLLamada();
}


//CLASE LLAMADALOCAL

public class LLamadaLocal extends LLamada {

private double coste;

public LLamadaLocal(String nor,String ndes,int dur){
super(nor,ndes,dur);
coste=0.15;
}

public double costeLLamada(){
double costetotal=coste*super.getDuracion();
return costetotal;
}
}


//CLASE LLAMADAPROVINCIAL

public class LLamadaProvincial extends LLamada {

private double coste=0;
private int franja;

public LLamadaProvincial(String nor,String ndes,int dur, int f){
super(nor,ndes,dur);
franja=f;
switch (franja){
case 1: coste=0.20;break;
case 2: coste=0.25;break;
case 3: coste=0.30;break;
}
}
public double costeLLamada(){
double costetotal=coste*super.getDuracion();
return costetotal;
}
}

//CLASE ACTIVIDAD4

public class Actividad4 {

public static void main(String[] args) {
Centralita centralita=new Centralita();
LLamadaLocal local1=new LLamadaLocal("666341010","666312502",10);
LLamadaLocal local2=new LLamadaLocal("666341010","666312502",10);
LLamadaLocal local3=new LLamadaLocal("666341010","666312502",10);
LLamadaProvincial prov1=new LLamadaProvincial("555341010","555312502",3,1);
LLamadaProvincial prov2=new LLamadaProvincial("555341010","555312502",2,2);
LLamadaProvincial prov3=new LLamadaProvincial("555341010","555312502",5,3);
centralita.registraLLamada(local1);
centralita.registraLLamada(prov1);
centralita.registraLLamada(local2);
centralita.registraLLamada(prov2);
centralita.registraLLamada(local3);
centralita.registraLLamada(prov3);
centralita.printInforme();
}
}