2009-04-14 24 views
85

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

+29

No estoy de acuerdo con que este sea un duplicado "exacto". –

Respuesta

107

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.

+0

@JaredPar: supongo que es para desalentar la respuesta a preguntas duplicadas (por cierto, no soy el que te votó negativamente) – Brann

+11

@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

+2

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

5

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.

59

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.

6

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.

Cuestiones relacionadas