c# - qué - ¿Cuál es la diferencia entre una clase abstracta y una interfaz?
qué diferencia hay entre clases abstractas e interfaces (5)
Desde MSDN :
Al usar interfaces, puede, por ejemplo, incluir el comportamiento de múltiples fuentes en una clase. Esa capacidad es importante en C # porque el lenguaje no admite herencia múltiple de clases
Entonces, usa la interfaz si quieres que cualquier clase pueda heredar esos métodos.
Desde la misma página de MSDN:
Además, debe usar una interfaz si desea simular herencia para structs, ya que en realidad no pueden heredar de otra estructura o clase.
Esta pregunta ya tiene una respuesta aquí:
- ¿Interfaz o clase abstracta? 15 respuestas
Supongamos que tenemos dos métodos M1()
y M2()
en una interfaz. Una clase abstracta también tiene exactamente los mismos dos métodos abstractos. Si alguna clase implementó esta interfaz o se hereda de la clase abstracta, tendrá que implementar ambos métodos en ella.
Entonces, para mí, parece que una interfaz o una clase abstracta se comporta igual para mi escenario. Entonces, ¿alguien puede resaltar la diferencia entre estos dos en este caso específico y sugerir si se usa una clase abstracta o una interfaz aquí?
Dos pensamientos rápidos sobre las diferencias entre interfaces y clases abstractas:
- Se desean clases abstractas si es probable una expansión futura, ya que se puede ampliar una clase abstracta, pero una interfaz tendría que mejorarse mediante la adición de otra interfaz, I2.
- La herencia única (implementación) significa que elige cuidadosamente las clases abstractas, para reflejar más fielmente la verdadera naturaleza básica. Las interfaces se pueden agregar fácilmente a una implementación, pero una clase abstracta solo se puede agregar si aún no hay una.
Existen diferencias técnicas entre las clases abstractas y las interfaces, que al ser una clase abstracta puede contener la implementación de métodos, campos, constructores, etc., mientras que una interfaz solo contiene prototipos de métodos y propiedades. Una clase puede implementar múltiples interfaces, pero solo puede heredar una clase (abstracta o no).
Sin embargo, en mi opinión, la diferencia más importante entre interfaces y clases abstractas es la diferencia semántica.
Una interfaz define qué puede hacer algo (cómo se comporta) y una clase abstracta define qué es algo.
Tomemos por ejemplo IEnumerable
, el significado semántico detrás de esto es que cualquier cosa que implemente IEnumerable
es enumable, no significa que sea una enumeración, sino que puede comportarse como uno (se puede enumerar).
Contraste eso con el ejemplo de la lavadora , cualquier cosa que lo herede es un tipo de lavadora. Todo lo que lo herede sería un tipo de lavadora, cargador superior o cargador lateral, etc.
En cambio, si tuviera una interfaz llamada ICanWash
, que podría contener un método llamado Wash
. Puede tener varias cosas para implementar ICanWash
, ya sea una Person
, una clase de lavadora abstracta, etc., donde la implementación real no importa, solo necesita saber que el comportamiento es que puede lavar cosas.
En resumen, las clases definen qué es algo, las interfaces definen qué puede hacer algo.
La clase abstracta no solo contiene métodos abstractos, sino que también puede contener otros campos y métodos con implemntation. En c # no puede heredar de las clases de multiples, pero puede implementar interfaces multiples. Entonces la respuesta corta es: siempre que sea posible, use interfaces y no clases abstractas. En su ejemplo, es posible y, por lo tanto, es recomendable utilizar una interfaz.
La interfaz permite que una clase herede / implemente más de una interfaz, mientras que en C # solo puede heredar de una clase.
Herencia múltiple, básicamente.