¿Cuándo utilizar una clase o interfaz abstracta? [cerrado]
¿Por qué se crean clases abstractas o de interfaz, o cuándo deberíamos usar clases abstractas o de interfaz?
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.
La diferencia clave es que puede tener implement
varias interfaces en una clase, pero solo extend
una clase abstracta. Esto se debe a que una clase abstracta también puede definir campos que almacenan datos, mientras que una interfaz no puede.
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.
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 Friend
debe 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 myFriend
ha 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.