¿Cuándo utilizar una clase o interfaz abstracta? [cerrado]

Resuelto JavaResp asked hace 15 años • 6 respuestas

¿Por qué se crean clases abstractas o de interfaz, o cuándo deberíamos usar clases abstractas o de interfaz?

JavaResp avatar Aug 03 '09 16:08 JavaResp
Aceptado

La interfaz se usa cuando solo desea declarar qué métodos y miembros DEBE tener una clase. Cualquiera que implemente la interfaz deberá declarar e implementar los métodos enumerados en la interfaz.

Si también desea tener una implementación predeterminada, use una clase abstracta. Cualquier clase que extienda la clase abstracta tendrá que implementar solo sus métodos y miembros abstractos, y tendrá alguna implementación predeterminada de los otros métodos de la clase abstracta, que puede anular o no.

--EDITAR - olvidé mencionarlo, Earwicker me lo recordó

Finalmente, puedes implementar tantas interfaces como quieras, pero solo extender una clase (ya sea abstracta o no). Tenlo en cuenta antes de elegir.

Samuel Carrijo avatar Aug 03 '2009 10:08 Samuel Carrijo

La diferencia clave es que puede tener implementvarias interfaces en una clase, pero solo extenduna clase abstracta. Esto se debe a que una clase abstracta también puede definir campos que almacenan datos, mientras que una interfaz no puede.

Daniel Earwicker avatar Aug 03 '2009 10:08 Daniel Earwicker

Una clase abstracta es una clase que tiene al menos un método abstracto o también puede hacer que todos sus métodos sean abstractos. Obviamente no se puede crear una instancia. Tienes que heredar de una clase abstracta e implementar los métodos abstractos en la clase heredera (es decir, la clase que extiende la clase abstracta).

Las interfaces no son clases en absoluto (así que no las llames clase de interfaz). Las interfaces definen la firma de métodos sin ninguna implementación. Además, las interfaces no tienen campos de miembros. Si implementa una interfaz en una clase, debe proporcionar implementaciones para todos los métodos proporcionados por la interfaz.

Tiene sentido definir una API generalizada para algunas cosas, que pueden tener implementaciones completamente diferentes. Las clases abstractas son más útiles para clases que hacen básicamente lo mismo, pero tienen algunas diferencias sutiles. Puedes combinar ambos enfoques.

Un buen ejemplo es el marco de colecciones de la biblioteca de clases de Java. Tienes la interfaz Lista, que define cómo deben comportarse las Listas. Algunas implementaciones son, por ejemplo, ArrayList y LinkedList. Como se comportan de manera similar, lo que funciona igual para ambos se implementa en la clase abstracta AbstactList, ambos heredan esto.

Mnementh avatar Aug 03 '2009 10:08 Mnementh

Ver Interfaz es básicamente un "Contrato". Cuando estás definiendo una interfaz estás definiendo un Contrato. Cuando se amplían las clases abstractas, se implementan interfaces.

Consideremos un ejemplo.

public interface Friend {
void hello();
}

Ahora ha definido un contrato que dice que cualquier clase que quiera implementar Frienddebe proporcionar una definición para el método hello().

Aquí hay una implementación:

public class myFriend implements Friend {
public void hello()
println("Done");
}

Ahora myFriendha cumplido el contrato. Ahora la pregunta es: ¿Dónde deberían usarse las interfaces?

Las interfaces le ayudan a definir un comportamiento que debe implementarse. Digamos que tiene una clase A que define alguna funcionalidad. Quiere que las otras clases utilicen esta funcionalidad de clase sólo si definen un comportamiento particular (métodos). Usted aplica esta restricción en términos de interfaz.

Duleb avatar Aug 03 '2009 10:08 Duleb