elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 23:51  


Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java (Moderadores: Debci, Leyer)
| | | |-+  Utilizar métodos sobreescritos o una estructura If
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Utilizar métodos sobreescritos o una estructura If  (Leído 859 veces)
Aikanáro Anário


Desconectado Desconectado

Mensajes: 626



Ver Perfil WWW
Utilizar métodos sobreescritos o una estructura If
« en: 24 Septiembre 2011, 20:03 »

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.
Código:
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
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
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 por Aikanáro Anário » En línea

Lo que faltaba en internet: http://binar10s.blogspot.com/
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #1 en: 24 Septiembre 2011, 20:11 »

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


Desconectado Desconectado

Mensajes: 626



Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #2 en: 24 Septiembre 2011, 20:42 »

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

Lo que faltaba en internet: http://binar10s.blogspot.com/
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #3 en: 24 Septiembre 2011, 20:52 »

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


Desconectado Desconectado

Mensajes: 626



Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #4 en: 24 Septiembre 2011, 21:02 »

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

Lo que faltaba en internet: http://binar10s.blogspot.com/
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #5 en: 24 Septiembre 2011, 21:12 »

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

Código
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 por Debci » En línea
Aikanáro Anário


Desconectado Desconectado

Mensajes: 626



Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #6 en: 24 Septiembre 2011, 22:13 »

Código
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
public LlamadaLocal(double duracion, String numOrigen, String numDestino){
super(duracion, numOrigen, numDestino);
this.ID = "Local";
this.precio = 0;
}
En línea

Lo que faltaba en internet: http://binar10s.blogspot.com/
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #7 en: 24 Septiembre 2011, 22:33 »

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
 
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
En línea
Aikanáro Anário


Desconectado Desconectado

Mensajes: 626



Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #8 en: 24 Septiembre 2011, 22:47 »

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

Lo que faltaba en internet: http://binar10s.blogspot.com/
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Utilizar métodos sobreescritos o una estructura If
« Respuesta #9 en: 25 Septiembre 2011, 16:28 »

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines