Interfaces vs clases abstractas [duplicate]


Esta pregunta ya tiene una respuesta aquí:

En C#, cuándo debe usar interfaces y cuándo se deben usar clases abstractas? ¿Cuál puede ser el factor decisivo?

Author: Patrick Hofman, 2009-04-14

4 answers

Las ventajas de una clase abstracta son:

  • Capacidad para especificar implementaciones predeterminadas de métodos
  • Se ha añadido la comprobación de invariantes a las funciones
  • Tienen un poco más de control en cómo se llaman los métodos de" interfaz "
  • Capacidad de proporcionar un comportamiento relacionado o no con la interfaz para "free"

Las interfaces son simplemente contratos de transmisión de datos y no tienen estas características. Sin embargo, normalmente son más flexibles ya que un tipo solo se puede derivar de una clase, pero puede implementar cualquier número de interfaces.

 118
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-22 15:18:54

Las clases abstractas y las interfaces son semánticamente diferentes, aunque su uso puede superponerse.

Una clase abstracta se usa generalmente como base de construcción para clases similares. La implementación que es común para las clases puede ser en la clase abstracta.

Generalmente se usa una interfaz para especificar una habilidad para las clases, donde las clases no tienen que ser muy similares.

 66
Author: Guffa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-14 13:33:05

Otra cosa a considerar es que, dado que no hay herencia múltiple, si desea que una clase pueda implementar/heredar de su clase interfaz/abstracta, pero heredar de otra clase base, use una interfaz.

 6
Author: Zifre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-14 13:29:37

La pregunta real es: si usar interfaces o clases base. Esto ya se ha tratado antes.

En C#, una clase abstracta (una marcada con la palabra clave "abstract") es simplemente una clase de la que no se pueden crear instancias de objetos. Esto sirve a un propósito diferente que simplemente hacer la distinción entre clases base e interfaces.

 5
Author: Dave Van den Eynde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-14 13:24:04