Foros del Web » Programación para mayores de 30 ;) » Java »

Crear Clase con especializaciones

Estas en el tema de Crear Clase con especializaciones en el foro de Java en Foros del Web. Hola muy buenas, tengo un pequeño problema, tengo que crear una clase abstracta con una serie de métodos, de los cuales solo uno de ellos ...
  #1 (permalink)  
Antiguo 22/04/2014, 08:51
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 14 años, 5 meses
Puntos: 0
Crear Clase con especializaciones

Hola muy buenas,

tengo un pequeño problema, tengo que crear una clase abstracta con una serie de métodos, de los cuales solo uno de ellos es abstracto, el resto, por lo que supongo serán iguales en las dos especializaciones.

He creado la clase principal, y luego las dos clases extendidas de la primera.

Mi pregunta es que si en las clases hijas debo definir los métodos definidos en la clase padre. Ya que cuando creo un objeto, éste debe ser del tipo 1 o tipo 2, siendo cada uno de ellos una especialización de la clase padre.

Espero que se entienda, más tarde intentaré poner el código.

Para mas información, los temas que estoy tratando son: Herencia, Excepciones, Paquetes

Muchas Gracias

Última edición por siuxoes; 22/04/2014 a las 08:57
  #2 (permalink)  
Antiguo 22/04/2014, 09:19
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Crear Clase con especializaciones

Hola:

No tienes que volver a escribir los métodos de la clase padre, salvo que quieras que hagan algo distinto a lo que hace la clase padre. La herencia es eso, la clase tipo1 y tipo2 "heredan" todo lo que tiene la padre, incluidos los métodos ya implementados.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 22/04/2014, 13:20
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Crear Clase con especializaciones

Entonces, Si creo una clase llamada 'Padre' y dos clases llamadas 'Hija1' e 'Hija2', donde la clase 'Padre' es abstracta y es la súper clase de las dos clases hijas. En 'Hija1' no debo poner ningún método a no ser, que el método sea abstracto y quiera "personalizarlo", ¿no?

Pero si debo crear un Constructor en 'Hija1' e 'Hija2', no? Porque si quiero crear un objeto de 'Hija1', por ejemplo, debe tenerlo, verdad?

Pero si mi, constructor en 'Padre' tiene excepciones, debo ponerla en el constructor de 'Hija1'.

Talque:

Código:
public class Padre
{
public Padre(atributos...) throws EXCEPCIONES
{
if(condicion)
{
throw new... EXCEPCION();
}
else
{
this.atributos=atributos;
}
}
}
Código:
public class Hija1 extends Padre
{
public Hija1(atributos...) throws EXCEPCIONES
{
if(condicion)
{
throw new... EXCEPCION();
}
super(atributos);
}
}
Debo volver a definir las excepciones, en la clase hija o solo poner el super?

Además, entonces al crear un objeto de la clase 'Hija1', podré usar cualquier método redactado en 'Padre', verdad?

Saludos y gracias

Última edición por siuxoes; 22/04/2014 a las 13:30
  #4 (permalink)  
Antiguo 23/04/2014, 03:20
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Crear Clase con especializaciones

Si quieres instanciar las clases Hija, tienes que definir el método abstracto, ya que en la clase padre se supone que no tiene código ninguno.

Si la clase padre tiene constructor sin parámetros, no es necesario definirlo en las Hijas. Si la clase padre tiene constructores con parámetros y quieres usarlos, tienes que definir constructores en la clase hija que llamen al constructor de la clase padre con super(....)

El consructor de la clase Hija puede simplemente llamar a la padre

Código Java:
Ver original
  1. public class Hija1 extends Padre {
  2.    public Hija1(parametros) throws EXCEPTION {
  3.             super(parametros);
  4.    }
  5. }

Otro tema es que quieras cambiar las condiciones. De todas formas, creo que super(...) debe ser la primera línea que pongas en el constructor, así que las condiciones deberás comprobarlas después. Si haces la prueba el compilador te lo dirá.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 23/04/2014, 04:31
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Crear Clase con especializaciones

Cita:
De todas formas, creo que super(...) debe ser la primera línea que pongas en el constructor, así que las condiciones deberás comprobarlas después. Si haces la prueba el compilador te lo dirá.
Efectivamente, todos los constructores deben empezar con this o super.

Cuando no pones ningún constructor, el compilador crea el constructor sin parámetros automáticamente, si hay otro con parámetros no lo hace.

Cuando en el constructor no pones el super/this también lo añade automáticamente, pero sólo la llamada al constructor sin parámetros. Para llamar a un constructor this/super con párametros siempre hay que hacerlo manualmente, y en la primera línea.

Cita:
Pero si mi, constructor en 'Padre' tiene excepciones, debo ponerla en el constructor de 'Hija1'.
Con respecto a las excepciones checked si quieres cambiarlas no pueden ser más genéricas que las de la clase super.

Cita:
public class ExceptionClass{
void m() throws SQLException{}

}

class A extends ExceptionClass{

void m() throws Exception{}
}
Da error porque Exception es más genérica que SQLException, al revés si funcionaría.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 23/04/2014, 07:06
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Crear Clase con especializaciones

Cita:
Iniciado por Xerelo Ver Mensaje
Efectivamente, todos los constructores deben empezar con this o super.

Cuando no pones ningún constructor, el compilador crea el constructor sin parámetros automáticamente, si hay otro con parámetros no lo hace.

Cuando en el constructor no pones el super/this también lo añade automáticamente, pero sólo la llamada al constructor sin parámetros. Para llamar a un constructor this/super con párametros siempre hay que hacerlo manualmente, y en la primera línea.



Con respecto a las excepciones checked si quieres cambiarlas no pueden ser más genéricas que las de la clase super.


Da error porque Exception es más genérica que SQLException, al revés si funcionaría.
Realmente, no quiero cambiar las excepciones. Yo quiero que por ejemplo en la clase 'Padre', haya una excepción que salte cuando el nombre sea igual a 'null', y al crear un objeto de la clase 'Padre' salte la excepción, ya que no posee nombre. Y por esto quiero saber si debo definir las mismas excepciones, sin cambiarlas, en la clase 'hija1', ya que esta tiene exactamente las mismas que la clase 'Padre'.

Es decir, al crear una objeto de la clase 'hija1', y no posea nombre, sea null, salte la excepción definida anteriormente.

Gracias
  #7 (permalink)  
Antiguo 23/04/2014, 07:23
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Crear Clase con especializaciones

Para eso no necesitas nada, ni en la padre ni en la hija. Una excepción por null es un NullPointerException, y eso es una excepción unchecked o de runtime

http://docs.oracle.com/javase/7/docs...Exception.html

Esas excepciones no necesitan declararse con un throw.

Una alternativa para mí quizás más correcta sería usar la IllegalArgumentException

http://docs.oracle.com/javase/7/docs...Exception.html

yo si hago una comprobación para ver que x dato es null, prefiero lanzar esta, de esa forma cuando veo un nullpointer sé que o me falta por controlar o hay algo en el código/lógica incorrecto.

Es también una runtimeException por lo que tampoco tienes que hacer nada, sólo lanzarla.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Última edición por Xerelo; 23/04/2014 a las 07:29
  #8 (permalink)  
Antiguo 23/04/2014, 07:32
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Crear Clase con especializaciones

Realmente si debo declararlas, ya que son excepciones que yo mismo creo, ya que las tengo en un paquete llamado 'Excepciones', que debo importar a la clase 'Padre'. Mi pregunta sigue siendo la misma, debo seguir declarándolas en la clase 'Hija1', si ya están definidas en el constructor 'Padre'?

Saludos
  #9 (permalink)  
Antiguo 23/04/2014, 07:42
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Crear Clase con especializaciones

Esto es sencillo.

Primero, ¿por qué necesitas crear tu propia excepción cuando ya existe una pensada para eso? En ocasiones es necesario, pero con los datos que aportas no lo parece.

Segundo, da igual que sean excepciones creadas por ti, la diferencia es de quien heredan tus excepciones.

Si heredan de Exception tendrás una checked, por lo tanto tanto en el madre como en la hija tendrás que añadir el throws. Si heredan de RuntimeException no.

http://docs.oracle.com/javase/7/docs...Exception.html

Cita:
The class Exception and any subclasses that are not also subclasses of RuntimeException are checked exceptions. Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #10 (permalink)  
Antiguo 24/04/2014, 17:50
 
Fecha de Ingreso: noviembre-2009
Mensajes: 6
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Crear Clase con especializaciones

Tengo que crearlas porque el trabajo que tengo que realizar para clase me vienen dadas unas excepciones que se tienen que ejecutar si se cumple una condición.

He mirado y heredan de Exception. Por lo tanto ¿cómo debo definir la misma excepción en la clase hija?

Saludos
  #11 (permalink)  
Antiguo 25/04/2014, 05:10
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: Crear Clase con especializaciones

Cita:
Iniciado por siuxoes Ver Mensaje
Tengo que crearlas porque el trabajo que tengo que realizar para clase me vienen dadas unas excepciones que se tienen que ejecutar si se cumple una condición.

He mirado y heredan de Exception. Por lo tanto ¿cómo debo definir la misma excepción en la clase hija?

Saludos
Cita:
Si heredan de Exception tendrás una checked, por lo tanto tanto en el madre como en la hija tendrás que añadir el throws
Tienes que añadir lo mismo en las dos.

Piensa que los constructores no se heredan, por lo tanto no se sobreescriben.

En realidad lo que se hace es que el nuevo constructor llame al constructor del padre (super), así que ocurre lo mismo que para cualquier método que llame a un método con un throws declarado, o capturas la excepción o la propagas con el throws.

La única diferencia es que por el polimorfismo en una "herencia" no puedes poner un throws con una excepción más genérica.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: clase
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:44.