Autor
|
Tema: Utilizar métodos sobreescritos o una estructura If (Leído 5,237 veces)
|
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í. 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í: 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.
|
|
« Última modificación: 24 Septiembre 2011, 20:07 pm por Aikanáro Anário »
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
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?
|
|
|
En línea
|
|
|
|
pianista
|
Vamos a ver, tu desde la central haces lo siguiente: 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
|
|
« Última modificación: 27 Septiembre 2011, 14:46 pm por Debci »
|
En línea
|
|
|
|
Aikanáro Anário
|
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 public LlamadaLocal (double duracion, String numOrigen, String numDestino ){ super(duracion, numOrigen, numDestino); this.ID = "Local"; this.precio = 0; }
|
|
|
En línea
|
|
|
|
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: double time = 1.6; 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
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
|
|