En C#, ¿cuándo debería usar interfaces y cuándo debería usar clases abstractas? ¿Cuál puede ser el factor decisivo?Interfaces vs. clases abstractas
Respuesta
Las ventajas de una clase abstracta son:
- capacidad de especificar implementaciones por defecto de los métodos
- Añadido comprobación invariante a las funciones
- Tiene un poco más de control sobre cómo los métodos de "interfaz" se llaman
- Capacidad para proporcionar un comportamiento relacionado o no relacionado con la interfaz para "libre"
Las interfaces son simplemente contratos de transferencia de datos y no tienen estas características. Sin embargo, suelen ser más flexibles ya que un tipo solo puede derivarse de una clase, pero pueden implementar cualquier cantidad de interfaces.
@JaredPar: supongo que es para desalentar la respuesta a preguntas duplicadas (por cierto, no soy el que te votó negativamente) – Brann
@Brann, desafortunadamente he visto ese comportamiento antes. Parece que tendría más sentido usar el voto negativo en el PO. Es su responsabilidad buscar tontos. – JaredPar
Me sorprende que esta respuesta tenga tantos votos ascendentes y sea la respuesta aceptada. Parece mostrar el sesgo del respondedor ("ventajas de la clase abstracta" seguido de cuatro viñetas de ventajas seguidas de "las interfaces son meramente" seguidas de un único "sin embargo" a favor de las interfaces) hacia clases abstractas mucho más que describir realmente las diferencias entre clases e interfaces abstractas. No estoy tratando de atacar al que responde, pero sin duda esta pregunta debe formularse de una manera más objetiva para hacer la mejor justicia a la pregunta. – Matt
La verdadera pregunta es si usar interfaces o clases base. Esto ha sido cubierto antes.
En C#, una clase abstracta (una marcada con la palabra clave "abstracta") es simplemente una clase de la cual no se pueden crear instancias de objetos. Esto tiene un propósito diferente a simplemente hacer la distinción entre clases base e interfaces.
Las clases e interfaces abstractas son semánticamente diferentes, aunque su uso puede superponerse.
Una clase abstracta se usa generalmente como una base de construcción para clases similares. La implementación que es común para las clases puede ser en la clase abstracta.
Una interfaz se utiliza generalmente para especificar una capacidad para las clases, donde las clases no tienen que ser muy similares.
Otra cosa a tener en cuenta es que, dado que no hay herencia múltiple, si desea que una clase pueda implementar/heredar de su clase interfaz/abstracta, pero herede de otra clase base, use una interfaz.
- 1. estilo de código Java - Interfaces vs. clases abstractas
- 2. Delegados (expresiones Lambda) Vs Interfaces y clases abstractas
- 3. Pruebas unitarias clases abstractas y/o interfaces
- 4. ¿Por qué crear clases e interfaces abstractas?
- 5. Qt interfaces o clases abstractas y qobject_cast()
- 6. ¿Es pitónico utilizar interfaces/clases base abstractas?
- 7. C#: ¿Las clases abstractas necesitan implementar interfaces?
- 8. Cuándo usar interfaces o clases abstractas? Cuándo usar ambos?
- 9. php clases e interfaces abstractas que implican métodos estáticos?
- 10. ¿Por qué XmlSerializer serializa clases abstractas pero no interfaces?
- 11. C# tiene clases e interfaces abstractas, ¿debería tener también "mixins"?
- 12. ¿Las clases abstractas de Do/can reemplazan las interfaces?
- 13. Grandes clases base abstractas
- 14. ventajas de usar un clases abstractas vs. clase regular
- 15. referencias abstractas a interfaces genéricas
- 16. AS3 - clases abstractas
- 17. Clases selladas abstractas
- 18. ¿Constructores en clases abstractas?
- 19. ¿Múltiples clases abstractas derivadas?
- 20. JAXB y clases abstractas
- 21. Clases abstractas en relaciones GORM
- 22. .net Herencia múltiple de las clases abstractas
- 23. Cómo crear propiedades abstractas en las clases abstractas de Python
- 24. Alternativas a java.lang.reflect.Proxy para la creación de proxies de clases abstractas (en lugar de las interfaces)
- 25. ¿Insinúa el tipo de php no llevarse bien con las interfaces y las clases abstractas?
- 26. "Interfaces y clases abstractas innecesarias en Ruby" -> ¿Alguien puede explicar?
- 27. Eclipse Package Explorer tiene diferentes iconos para cada tipo de archivo: interfaces, clases abstractas, etc.
- 28. C# - Cómo hacer MÚLTIPLES "mixins" correctamente con interfaces y/o clases abstractas
- 29. paquete java.util - classes vs interfaces
- 30. debería nombrar todas mis clases abstractas AbstractFoo
No estoy de acuerdo con que este sea un duplicado "exacto". –