¿Cuál es la diferencia entre clases concretas y clases abstractas?


Respuesta 1:

La única diferencia real es que una clase concreta se puede instanciar porque proporciona (o hereda) la implementación de todos sus métodos. No se puede crear una instancia de una clase abstracta porque no se ha implementado al menos un método.

Las clases abstractas están destinadas a ser extendidas. Si proporcionan algún detalle de implementación, todas las clases secundarias pueden reutilizarlo. Un caso especial es la clase abstracta pura, que no proporciona ninguna implementación en absoluto. Estas clases no ayudan con la reutilización de código, lo que las hace fundamentalmente diferentes. Esta diferencia se describe por los dos tipos de herencia:

  1. Herencia de implementación: proporciona un mecanismo para la reutilización del código. Herencia de interfaz: proporciona un mecanismo para subtipar.

Si la Clase B extiende la Clase A, eso no significa necesariamente que B sea una A. Podría significar que B hereda algún código de A. No siempre es claro, y algunos lenguajes lo combinan con subtipificación.

Java es un ejemplo de un lenguaje que proporciona una construcción diferente para el subtipo, llamada interfaz. Las interfaces son básicamente clases abstractas puras. Si la clase B implementa la interfaz A, entonces B es una A.

Cuando un lenguaje desacopla la herencia de implementación de la herencia de interfaz, es posible tratar ciertos problemas de manera diferente. Por ejemplo:

  1. Java evita la complejidad de la herencia múltiple al prohibir que una clase tenga dos superclases. Sin embargo, una clase es libre de implementar cualquier número de interfaces. Es más fácil seguir el principio de favorecer la composición sobre la herencia. Extender demasiadas clases puede conducir a jerarquías de clases complejas, pero implementar demasiadas interfaces no es un gran problema. Cuando se trata de rastrear el flujo de ejecución a través de un programa, las interfaces no pueden complicar el problema porque no incluyen ningún código ejecutable.

Respuesta 2:

Las clases abstractas generalmente tienen implementación parcial o nula. Por otro lado, las clases concretas siempre tienen una implementación completa de su comportamiento. A diferencia de las clases concretas, las clases abstractas no pueden ser instanciadas. Por lo tanto, las clases abstractas deben ampliarse para que sean útiles. Las clases abstractas pueden contener métodos abstractos, pero las clases concretas no pueden. Cuando se extiende una clase abstracta, todos los métodos (tanto abstractos como concretos) se heredan. La clase heredada puede implementar cualquiera o todos los métodos. Si no se implementan todos los métodos abstractos, esa clase también se convierte en una clase abstracta.


Respuesta 3:

Supongamos que hay una interfaz para ser implementada por cualquiera de las clases.

La clase concreta implementa todos los métodos de interfaces y, por lo tanto, puede instanciarse sin más preámbulos.

Si, por alguna razón, desea omitir la implementación de ciertos métodos (por ejemplo, desea escribir dos implementaciones de la interfaz que difieran poco entre sí), escriba una clase abstracta, que no se puede instanciar directamente. Para crear una instancia de una clase abstracta, usted escribe una subclase concreta ("extiende") donde implementa los métodos restantes, o proporciona la implementación de esta última cuando crea una instancia (que técnicamente es lo mismo: "usted escribió una subclase concreta", pero es uno anónimo).


Respuesta 4:

Supongamos que hay una interfaz para ser implementada por cualquiera de las clases.

La clase concreta implementa todos los métodos de interfaces y, por lo tanto, puede instanciarse sin más preámbulos.

Si, por alguna razón, desea omitir la implementación de ciertos métodos (por ejemplo, desea escribir dos implementaciones de la interfaz que difieran poco entre sí), escriba una clase abstracta, que no se puede instanciar directamente. Para crear una instancia de una clase abstracta, usted escribe una subclase concreta ("extiende") donde implementa los métodos restantes, o proporciona la implementación de esta última cuando crea una instancia (que técnicamente es lo mismo: "usted escribió una subclase concreta", pero es uno anónimo).