¿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?
Respuesta
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.
Esa no es la diferencia fundamental: puedes crear una clase de abtract que solo tenga métodos abstractos. –
En este caso, ¿por qué no utilizar una interfaz? –
¡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. –
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.
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!
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.
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.
¡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. –
en realidad también puede tener campos en una interfaz, pero solo si son estáticos y finales – FearlessHyena
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.
- 1. php: ¿Cuándo usar la clase abstracta y de interfaz?
- 2. Cómo y cuándo usar una clase abstracta
- 3. Clase abstracta 100% frente a la interfaz
- 4. Cuándo usar interfaces o clases abstractas? Cuándo usar ambos?
- 5. C# implementación anónima de la interfaz (o clase abstracta)
- 6. ¿Cuál es la clase o Interfaz rápida, abstracta?
- 7. clase abstracta no implementa interfaz
- 8. Interfaz o clase abstracta para cumplir el requisito
- 9. Java clase abstracta implementa la interfaz
- 10. ¿Razones para no usar clase abstracta en lugar de interfaz?
- 11. ¿Clase o interfaz abstracta para el servicio de IoC?
- 12. Clase o interfaz abstracta. ¿Qué camino es correcto?
- 13. Base abstracta o clase auxiliar
- 14. C# Interfaz implementada por clase abstracta vacía
- 15. crear objeto de clase abstracta e interfaz
- 16. Cuándo usar la clase Partitioner?
- 17. ¿Ventajas de usar la interfaz sobre la clase abstracta para el patrón de repositorio?
- 18. ¿Cómo se decide entre usar una clase abstracta y una interfaz?
- 19. ¿Qué es una CLASE ABSTRACTA e INTERFAZ y cuándo las usarías en PHP?
- 20. Derivar clase abstracta de la clase no abstracta
- 21. ¿Necesita una clase abstracta así como una interfaz?
- 22. No se puede crear una instancia de la clase abstracta o interfaz
- 23. "No se puede crear una instancia de la clase abstracta o interfaz" mensaje C# error
- 24. Las interfaces (interfaz/clase abstracta) no son abstracciones?
- 25. php clase abstracta extendiendo otra clase abstracta
- 26. Implementación dinámica para clase de interfaz/abstracta en Java
- 27. ¿Puedo usar la palabra clave `abstracta` en la clase C++
- 28. ¿Cuándo debería usar el generador de interfaz?
- 29. Generics: heredan de una clase abstracta que implementa una interfaz
- 30. Clase abstracta de Java Implementar una interfaz con genéricos
posible duplicado de [Java clase abstracta e interfaz] (http://stackoverflow.com/questions/5094825/java-abstract-class-and-interface) – duffymo
http://stackoverflow.com/questions/761194/interface -vs-abstract-class-general-oo –
https://stackoverflow.com/questions/479142/when-to-use-an-interface-instead-of-an-abstract-class-and-vice-versa contains best responde –