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

Clases abstractas

Estas en el tema de Clases abstractas en el foro de Java en Foros del Web. Una clase abstracta que tiene tres metodos abstractos, cuando se implemente por la subclase esta ¿va a tener que implementar los 3 métodos abstractos?...
  #1 (permalink)  
Antiguo 20/04/2006, 07:16
estebing
Invitado
 
Mensajes: n/a
Puntos:
Clases abstractas

Una clase abstracta que tiene tres metodos abstractos, cuando se implemente por la subclase esta ¿va a tener que implementar los 3 métodos abstractos?
  #2 (permalink)  
Antiguo 20/04/2006, 07:30
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
no necesariamente. Puede ser implementado por una subclase abstracta que solo implemente 2 o 1 metodo.
Ahora, si la clase que implementa, no tiene que ser abstracta, entonces si, tiene que implementar los 3 metodos abstractos

Por ejemplo, suponiendo que la clase abstracta padre es esta:
Código:
abstract class UNO {
	abstract void metodo1();
	abstract void metodo2();
	abstract void metodo3();
}
una clase que implemente uno o 2 de los metodos sería asi:
Código:
abstract class DOS extends UNO {
	void metodo1() { //codigo }
}
pero necesitarias de otra clase que implemente los metodos que faltan:
Código:
class TRES extends DOS {
	void metodo2(){ // codigo }
	void metodo3(){ // codigo }
}
Otra opcion es hacer que directamente la clase hija implemente todos los métodos:
Código:
class DOS extends UNO {
	void metodo1(){ // codigo }
	void metodo2(){ // codigo }
	void metodo3(){ // codigo }
}
Lo unico que tienes que recordar, es que si una clase no implementa todos los metodos de su padre, o de si mismo, entonces debe ser declarada como abstracta.

Saludos. Espero haber aclarado tu duda.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #3 (permalink)  
Antiguo 20/04/2006, 08:10
Avatar de Tipdar  
Fecha de Ingreso: octubre-2005
Ubicación: Aquí y allá.
Mensajes: 323
Antigüedad: 18 años, 6 meses
Puntos: 7
Para que implemente todos los métodos debe ser una interface... ahí si que estás obligado a carabina.
__________________
El último TipdaR
  #4 (permalink)  
Antiguo 20/04/2006, 11:08
estebing
Invitado
 
Mensajes: n/a
Puntos:
interfaces

si es una interface va implementar todos los metodos abstractos o no?
  #5 (permalink)  
Antiguo 20/04/2006, 14:39
Avatar de Tipdar  
Fecha de Ingreso: octubre-2005
Ubicación: Aquí y allá.
Mensajes: 323
Antigüedad: 18 años, 6 meses
Puntos: 7
public interface prueba {
public int metodo1();
public int metodo2();
}


Y en la clase
public class clase implements prueba {
//...
public int metodo1() {
//... implementacion
}

public int metodo2() {
//... implementacion
}

//...
}


Toda clase que implemente una interface tiene que implementar sus métodos.
__________________
El último TipdaR
  #6 (permalink)  
Antiguo 20/04/2006, 21:46
estebing
Invitado
 
Mensajes: n/a
Puntos:
re: interface

¿Ese es todo el uso que se le va a dar al programar?, tiene alguna característica mas la interface
  #7 (permalink)  
Antiguo 21/04/2006, 10:14
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Una de las utilidades de las interfaces, es que podes separar la definicion de la clase de la implementacion de la misma.

Por ejemplo: si tienes una clase que hace busquedas en arrays de numeros, mediante el metodo de busqueda lineal, y luego decides cambiarlo por la busqueda binaria, el unico cambio que tienes que hacer es la implementacion del metodo de busqueda en la clase que implementa la interfaz.
Saludos
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #8 (permalink)  
Antiguo 21/04/2006, 15:26
Avatar de Tipdar  
Fecha de Ingreso: octubre-2005
Ubicación: Aquí y allá.
Mensajes: 323
Antigüedad: 18 años, 6 meses
Puntos: 7
Otra cosa... Java no permite herencia múltiple... pero sí implementar cuantas interfaces necesites...
__________________
El último TipdaR
  #9 (permalink)  
Antiguo 21/04/2006, 15:57
Avatar de Miguel_e  
Fecha de Ingreso: junio-2004
Ubicación: Cuba
Mensajes: 108
Antigüedad: 19 años, 10 meses
Puntos: 0
Las interfaces se utilizan para brindarle un comportamiento dado a objetos que son diferentes, me explico mejor, una via de hacer esto es mediante la herencia, un ejemplo seria una aplicacion que debe hacer notificaciones, por ejemplo seria notificar a un email, a un beeper, un movil, a la misma aplicacion o a otra aplicacion, seria aconsejable tener una clase "Notificador" con un metodo que es abstracto, que seria "notificar" por llamarle de alguna manera, este metodo es comun a todos, lo que cada objeto lo implementa diferente, entonces creamos un objeto que heredaria de "Notificador" para cada nueva clase (EmailNotificador , BeeperNotificador, etc) que sobrescribiria el metodo notificar(los otros metodos se heredarian de la clase superpadre), que ventajas te da esto??? evitar repetir codigo que es comun a una familia de clases, te da la posibilidad de llamar de igual manera a un objeto y que haga acciones diferentes por ejemplo tendra una lista notificaciones pendientes que contendria n cantidad de EmailNotificador , BeeperNotificador, etc luego si quiero notificar puedo recorrer la lista llamando al metodo "notificar" y vamos recorriendo objetos llamandolos de igual manera y obtenemos diferentes comportamientos, que pasa cuando tienes una objeto que no es una notificacion sino que es algo completamente diferente pero que necesita notificar no podemos decir que esta es una especializacion de “Notificador” seria un error poner este nueva clase a heredar de “Notificador” y ahi es donde entran las interfaces las cuales no son mas que una serie de metodos que debe implementar la clase que la necesite, entonces declarariamos una interface que se llama Ej Notificar y todas las clases que necesitarian notificar entonces implementaria esta interface, esto te brinda un codigo mucho mas flexible a cambios, claridad, y permite que tus objetos se puedan relacionar de manera mejor.

Espero que haya sido capaz de explicarme de la mejor forma de todas maneras te recomiendo que estudies un poco de Programacion Orientada a Objetos esto te va a ayudar mucho sobre todo en un lenguaje que es Orientado a Objetos

salu2
miguel_e
  #10 (permalink)  
Antiguo 21/04/2006, 16:37
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Cita:
Iniciado por Tipdar
Otra cosa... Java no permite herencia múltiple... pero sí implementar cuantas interfaces necesites...
Ya que estamos hablando de interfaces y herencia múltiple:
¿Como resuelve Java el problema del diamante?
Osea, si tenemos una interfaz:

Código:
interface A {
     public int atributo1;
}

interface B extends A {
     public int atributo2;
}

interface C extends A {
     public int atributo3;
}
Y luego definimos una clase que implemente a estas 2 interfaces

Código:
class D implements B,C{
     public int atributo4;
}
Como hace java para solucionar el tema del atributo1 duplicado?

Programandolo en eclipse, al tratar de leer el atributo 1 en una clase tipo D, eclipse me dice que el atributo no existe, lo cual es mentira ya que es publico y esta definido en una clase superior.

¿Alguien sabe por que ocurre esto?
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #11 (permalink)  
Antiguo 26/04/2006, 13:12
Avatar de Miguel_e  
Fecha de Ingreso: junio-2004
Ubicación: Cuba
Mensajes: 108
Antigüedad: 19 años, 10 meses
Puntos: 0
Las interfaces no brindan las posiblidad de heredar atributos, solamente metodos, creo que te refires al problema de que ambas interfaces contengan metodos que se llamen igual, igual lista de parametros y devuelvan lo mismo, y la clase que implemente las dos interfaces no puede implementarlo a los dos, por lo que he leido esto se resuelve si puedes renombrar el metodo de una interface, sino estas frito

revisa el link este de todas maneras http://www.javaworld.com/javaworld/j...-diamond.html?


salu2
miguel_e
  #12 (permalink)  
Antiguo 26/04/2006, 20:42
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Gracias por tu respuesta Miguel.

Lei el link, y en este se explica claramente que heredar dos metodos abstractos que se llaman igual (tiene exactamente la misma declaracion) no genera problemas, ya que se copia solo una declaración.
Se copia una sola ya que la otra es exactamente igual.
Saludos
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #13 (permalink)  
Antiguo 27/04/2006, 10:48
Avatar de Miguel_e  
Fecha de Ingreso: junio-2004
Ubicación: Cuba
Mensajes: 108
Antigüedad: 19 años, 10 meses
Puntos: 0
NO estoy muy seguro de que sea tan asi, porque, no necesariamente lo que vaya a devolver el metodo es igual para ambas interfaces, ojo que no me refiero a tipo de datos sino que para una interface puede devolver un dato totalmente distinto que para otra. no se si me explico correctamente igual me dices y que siga el debate

salu2
miguel_e
  #14 (permalink)  
Antiguo 27/04/2006, 11:43
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Voy a ver que es lo que hace el compilador de java ante esta situacion.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #15 (permalink)  
Antiguo 27/04/2006, 11:49
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Porbando en Eclipse, cuando heredo 2 metodos iguales que difieren solo en el tipo de retorno, no me deja compilar la aplicación.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #16 (permalink)  
Antiguo 27/04/2006, 12:07
Avatar de Miguel_e  
Fecha de Ingreso: junio-2004
Ubicación: Cuba
Mensajes: 108
Antigüedad: 19 años, 10 meses
Puntos: 0
no me referia al tipo de dato sino al valor como tal, por ejemplo ambas interfaces tienen un metodo X que devuelve un boolean y mi clase imlementa ambas interface, solamente tengo un metodo pero por el contexto de cada interface quizas una debe devolver true y otra false, que se hace en ese caso???? era a eso cuando me referia y te pasaba el link, no se si me copias

salu2
miguel_e
  #17 (permalink)  
Antiguo 27/04/2006, 12:18
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Y eso ya entra en la mente del modelador, segun lo que quiera de cada clase.
Igual es una situacion muy poco común, pero posible.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #18 (permalink)  
Antiguo 27/04/2006, 16:42
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Aunque heredes de dos interfaces, para el compilador y la JVM, el metodo es uno y devuelve un valor. No hay más. Lo llames a través de la interfaz que lo llames, solo hay una implementación, asi que no hay confusion posible.
  #19 (permalink)  
Antiguo 27/04/2006, 22:38
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
el tema es cuando tienes dos metodos en 2 interfaces heredadas:
en al interfaz 1:
int metodo()

y en la interfaz 2:
long metodo()

Para el compilador esto es una ambiguedad
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #20 (permalink)  
Antiguo 28/04/2006, 00:37
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Exacto. Pero Miguel_e hablaba de dos métodos iguales en todo. Para el compilador ambas situaciones están claras, cuando los dos métodos son iguales sólo hay un método detrás. Cuando sólo cambian en el valor de retorno es un error de la clase y no compila.

De hecho el error no tiene nada que ver con las interfaces. Probad a crear una clase con dos metodos que solo se distingan en el valor de retorno y vereis que no es cuestion de herencia ni nada, es cuestion de poder determinar sin confusión que método llamar en cualquier momento.

Un saludo,
D.
  #21 (permalink)  
Antiguo 28/04/2006, 10:44
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Si, eso es verdad, pero el planteo inicial tenia que ver con la herencia de clases.

Saludos
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
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 02:34.