Utilizar métodos sobreescritos o una estructura If

Iniciado por Aikanáro Anário, 24 Septiembre 2011, 20:03 PM

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

Aikanáro Anário

La idea del tema es aplicar el polimorfismo, así que me respondo yo solo. Los métodos sobreescritos son los que debería usar, pero es que con un if es mucho más fácil y no veo ningún inconveniente.

Tengo que hacer un Control de Llamadas. Las llamadas provinciales tienen un costo dependiendo de la franja horaria donde se realicen (1, 2 ó 3).

Entonces tengo que hacer un método CalcularPrecio() en él que fácilmente pondría un estructura if.
If(franjaHoraria == 1){
...
}
else if (franjaHoraria == 2){
....
}
etc.


El problema viene al hacerlo con métodos sobre-cargados, tengo la idea, pero no sé si es la forma correcta.

Una forma sería (que no se hace xD) sería si se pudiera evaluar un parámetro de un método. Quería así.
Código (java) [Seleccionar]

public double CalcularPrecio(double duracion, int franjaHoraria==1){
this.duracion = duracion;
this.franjaHoraria = franjaHoraria;
precio = Valor_llamada_franja1 * duracion;
}


Pero me da error.

La otra que se me ocurre es poner el if dentro del método, pero no estoy seguro si esta es la forma correcta de implentar el polimorfismo.
Así:
Código (java) [Seleccionar]

public double CalcularPrecio(double duracion, int franjaHoraria){
 this.franjaHoraria = franjaHoraria;
 this.duracion = duracion;
 if(franjaHoraria == 1){
   //calcular el precio para franaja horaria es 1
 }
}
public double CalcularPrecio(double duracion, int franjaHoraria){
 this.franjaHoraria = franjaHoraria;
 this.duracion = duracion;
 if(franjaHoraria == 2){
   //calcular el precio para franaja horaria es 2
 }
}
etc...



Pero el problema es que cuando llame al método todos se van a ejecutar, porque todos tienen los mismo parámetros.
Lo que faltaba en internet: http://binar10s.blogspot.com/

pianista

Una manera elegante de hacer esto, si además del coste cambiará por ejemplo el método de tarificación sería montar un patrón estrategia.

http://es.wikipedia.org/wiki/Strategy_(patr%C3%B3n_de_dise%C3%B1o)

El polimorfismo es lo que usa ese patrón, tu tienes varios algoritmos implementados de diferente manera en cada clase que hereda de la abstracta por poner un ejemplo, o de la interfaz, y así no tienes que estar mirando el tipo.

Lo de los ifs efectivamente es cargarse el polimorfismo.

Saludos

Aikanáro Anário

O sea crear 3 clases: FranjaHoraria1, FranjaHoraria2 y FranjaHoraria3 que hereden de la clase LlamadaProvincia?

Cuando vaya a hacer una llamada será predeterminada, o sea, las instancias de la clase LlamadaProvincia van a tener los parámetros que yo elija. Por ejemplo hago una llamada a una provincia y le paso el parámetro de cuanto duro, el número de origen y destino.
Lo que faltaba en internet: http://binar10s.blogspot.com/

pianista

Si eso es.

Cuando tu hagas una llamada, dependiendo de la hora creas una instancia del tipo de llamada correspondiente.

Entonces luego solo tienes que invocar al método calcular de la clase y te devolverá lo que te ha costado la llamada.

Saludos

Aikanáro Anário

Entonces desde la clase Central (que es donde se hacen y registran las llamadas) debo crear 4 constructores. Uno para las locales, otras para la de las franjas 1, para la 2 y para la 3?
Lo que faltaba en internet: http://binar10s.blogspot.com/

pianista

#5
Vamos a ver, tu desde la central haces lo siguiente:

Código (java) [Seleccionar]
LLamada llamada; (Llamada es la clase abstracta de la que heredan las otras, incluso a lo mejor podría ser una interfaz, depende del contexto)

if(type==local){
llamada = new LlamadaLocal();
}

if(time==franja1){
llamada = new LLamadaFranja1();
}

if(time == franja2){
llamada = new LlamadaFranja2();
}

if(time==franja3){
llamada = new LlamadaFranja3();
}


y fuera, luego para calcular el coste harías:

int total = llamada.calcula(); (por ejemplo)

Saludos

Aikanáro Anário

Código (java) [Seleccionar]
public void RegistrarLlamadas(LlamadaLocal llamada){
llamada = new LlamadaLocal(double duracion, String numOrigen, String numDestino);
}


Me da error:
Multiple markers at this line
   - The constructor LlamadaLocal() is undefined
   - Syntax error on token ")", delete this token
   - Syntax error, insert ")" to complete
    ClassInstanceCreationExpression
   - Syntax error, insert ";" to complete BlockStatements
   - Syntax error on token ",", ; expected
   - Syntax error on token ",", ; expected

En la clase LlamadaLocal tengo el constructor
Código (java) [Seleccionar]
public LlamadaLocal(double duracion, String numOrigen, String numDestino){
super(duracion, numOrigen, numDestino);
this.ID = "Local";
this.precio = 0;
}
Lo que faltaba en internet: http://binar10s.blogspot.com/

pianista

Vamos a ver, primero te da esos errores porque no tiene sentido lo que haces.

Cuando haces llamada = new LlamadaLocal()

Tienes que pasarle los parametros (variables o valores a pelo), pero no poner double duracion,String numOrigen,String numDestino);, no se si me explico.

por ejemplo:

Código (java) [Seleccionar]


double time = 1.6;
String num1 = "666666666";
String num2="667777777";

llamada = new LlamadaLocal(time,num1,num2);



Por cierto tiene más sentido que a un método registrarLlamada le pases la superclase de la que heredan todos los tipos de llamada, que tienes. (podría llamarse Llamada a secas).

Saludos

Aikanáro Anário

Muchas gracias.

La verdad es que me siento perdido con java y la POO, tengo que ponerme a leer más material.
Lo que faltaba en internet: http://binar10s.blogspot.com/

pianista

Java al ser de alto nivel es un lenguaje bastante sencillo para empezar, pero si te recomiendo que leas libros que hablen un poco sobre lo que son las clases, la herencia, el polimorfismo y tal.

El de bertrand meyer usa eiffel, pero a lo mejor te puede servir para tener las nociones. Luego al final se aplican independientemente del lenguaje.

Saludos