2009-08-03 21 views
26

¿Por qué se crean clases abstractas o de interfaz, o cuándo debemos usar clases abstractas o de interfaz?Cuándo usar la clase o interfaz abstracta?

+1

posible duplicado de [Java clase abstracta e interfaz] (http://stackoverflow.com/questions/5094825/java-abstract-class-and-interface) – duffymo

+1

http://stackoverflow.com/questions/761194/interface -vs-abstract-class-general-oo –

+0

https://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and-vice-versa contains best responde –

Respuesta

37

La interfaz se utiliza cuando solo quiere declarar qué métodos y miembros DEBE tener una clase. Cualquiera que implemente la interfaz deberá declarar e implementar los métodos listados por la interfaz.

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

--edit - se olvidó de mencionar, Earwicker me recordó

Por último, se puede implementar tantas interfaces como desee, pero sólo extender una clase (siendo lo abstracto o no). Tenga esto en cuenta antes de elegir.

+2

Esa no es la diferencia fundamental: puedes crear una clase de abtract que solo tenga métodos abstractos. –

+1

En este caso, ¿por qué no utilizar una interfaz? –

+0

¡No diseñé el idioma! :) En teoría, podría tener algunos campos de datos protegidos en la clase abstracta, lo que no podría hacer con una interfaz. –

11

Una clase abstracta es una clase que no implementa algunos de sus métodos. Obviamente no puede ser instanciado. Tienes que heredar de una clase abstracta e implementar los métodos abstractos en otra clase.

Las interfaces no son clases en absoluto (así que no las llame 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 los métodos proporcionados por la interfaz.

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

Un buen ejemplo es el collections framework de la biblioteca de clases Java. Usted tiene la Lista de interfaz, que define cómo deben comportarse las Listas. Algunas implementaciones son, por ejemplo, ArrayList y LinkedList. A medida que se comportan de manera similar, las cosas que funcionan igual para ambos se implementan en la clase abstracta AbstactList, ambas heredan esto.

1

Las clases abstractas se usan cuando se está creando una jerarquía de herencia. Sin embargo, la mayoría de las jerarquías de herencia no deben ser demasiado "profundas" (es decir, demasiados niveles de herencia). Muchos libros de diseño orientados a objetos favorecerán las interfaces sobre la herencia (un libro que leí una vez citó a un desarrollador diciendo que "la herencia es la característica más genial [orientada a objetos] que no implementarás"), ya que permite asignar comportamientos a las clases " por contrato ", donde el contrato es la interfaz.

Vale la pena mencionar la respuesta de samuelcarrijo: si quiere tener una implementación predeterminada de un método, debería usar una clase abstracta que tenga una implementación concreta del método para darle una implementación predeterminada. Esta implementación predeterminada puede anularse en clases secundarias.

Espero que esto ayude!

2

SamuelCarrijo parece haber respondido bien a esta pregunta.

Además de Java, algunos marcos requieren una interfaz para trabajar. Estoy pensando en (digamos) dynamic proxies, o en algunos marcos de proxys cliente/servidor. Esto se debe a que utilizan la introspección en el objeto para determinar los métodos implementados por las interfaces implementadas por el objeto. De modo que ocasionalmente tiene que implementar una interfaz para un objeto donde, quizás, normalmente no se molestaría.

Nota este razón de interfaces es específico de Java.

15

La diferencia clave es que puede implement interfaces múltiples en una clase, pero solo extend una sola clase abstracta. Esto se debe a que una clase abstracta también puede definir campos que almacenan datos, mientras que una interfaz no puede.

+0

¡Buen punto! No me había acordado de eso. Java (como C#) no permite la herencia múltiple de clases, pero permitirá la implementación de tantas interfaces como desee. –

+0

en realidad también puede tener campos en una interfaz, pero solo si son estáticos y finales – FearlessHyena

3

See Interface es básicamente un "Contrato". Cuando define una interfaz, está definiendo un Contrato. Donde se extienden las clases abstractas, se implementan las interfaces.

Consideremos un ejemplo.

public interface Friend { 
void hello(); 
} 

Ahora se ha definido un contrato que dice que cualquier clase que quiere implementar Friend debe proporcionar una definición de método hello().

Aquí es 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 lo ayudan a definir un comportamiento que debe implementarse. Digamos que tiene una clase A que define alguna funcionalidad. Desea que las otras clases usen esta funcionalidad de clase solo si definen un comportamiento particular (métodos). Usted aplica esta restricción en términos de interfaz.

Cuestiones relacionadas