Gráfica comparativa
Bases para la comparación | Interfaz | Clase abstracta |
---|---|---|
BASIC | Cuando solo tiene el conocimiento de los requisitos no sobre su implementación, utiliza "Interfaz". | Cuando conoce parcialmente las implementaciones, utiliza "clases abstractas". |
Métodos | La interfaz solo contiene métodos abstractos. | La clase abstracta contiene métodos abstractos así como métodos concretos. |
Modificador de acceso de los métodos | Los métodos de interfaz son siempre "Públicos" y "Abstractos", incluso si no declaramos. Por lo tanto, se puede decir como 100%, clase abstracta pura. | No es obligatorio que el método en clase abstracta sea público y abstracto. Puede tener métodos concretos también. |
Modificador restringido para métodos | Un método de interfaz no puede ser declarado con los siguientes modificadores: Público: Privado y Protegido. Resumen: final, estático, sincronizado, nativo, strictfp. | No hay restricciones en los modificadores de la variable de clase abstracta. |
Modificador de Acceso de Variables | El modificador de acceso permitido para las variables de la interfaz es público, estático y final, ya sea que estemos declarando o no. | Las variables en clase abstracta no necesitan ser públicas, estáticas, finales. |
Modificadores restringidos para variables | Las variables de la interfaz no se pueden declarar como privadas, protegidas, transitorias, volátiles. | No hay restricción en los modificadores de las variables de clase abstracta. |
Inicialización de variables. | Las variables de la interfaz deben inicializarse en el momento de su declaración. | No es obligatorio que las variables de clase abstracta se inicialicen en el momento de su declaración. |
Instancia y bloques estáticos. | Dentro de la interfaz, no puede declarar una instancia o un bloque estático. | La clase abstracta permite una instancia o bloque estático dentro de ella. |
Constructores | No se puede declarar constructor dentro de la interfaz. | Puedes declarar constructor dentro de una clase abstracta. |
Definición de interfaz
Java no permite la herencia múltiple. Es decir, una sola clase no puede heredar más de una clase a la vez. La razón detrás de esto se puede explicar con un ejemplo. Supongamos que tenemos dos clases principales, A y B y una clase derivada C. La clase derivada C hereda tanto las clases A como la B. Ahora, ambos tienen la clase A y B tienen el método set (), entonces será una pregunta para la clase C, qué método set () de la clase debe heredar. La solución a este problema es la "interfaz".
access_specifier interface nombre_interfaz {return-type method-name1 (lista de parámetros); tipo-retorno nombre-método2 (lista de parámetros); escriba final-varname1 = valor; escriba final-varname2 = valor; // ... return-type nombre-métodoN (lista de parámetros); escriba final-varnameN = valor; }
El especificador de acceso se declara público porque las clases necesitan implementar la interfaz.
No tenemos el concepto de "Interfaz" en C ++. Pero, Java y C # definen muy bien la interfaz.
Interfaz en Java:
- Las variables de una interfaz son por defecto siempre públicas, estáticas y finales.
- Las variables deben ser inicializadas en el momento de su declaración.
- Las variables nunca pueden declararse como privadas, protegidas, transitorias y volátiles.
- Los métodos de una interfaz son siempre públicos y abstractos, mientras que nunca se pueden declarar como privados, protegidos, finales, estáticos, sincronizados, nativos y estrictos.
- No se puede declarar ningún constructor dentro de la interfaz, ya que el objetivo principal del constructor es la inicialización de las variables de clase, pero en la interfaz las variables se inicializan en el momento de su declaración.
- La interfaz puede heredar otras interfaces, pero la clase que implementa dicha interfaz debe implementar los métodos de todas las interfaces heredadas.
- Una clase puede heredar más de una interfaz a la vez, y debe implementar todos los métodos de todas las interfaces heredadas.
La forma general de implementar una interfaz en Java:
class class_name implementa Interface_name {// class-body}
Para heredar una interfaz, una clase usa una palabra clave "implementa", y la clase implementa todo el método declarado por una interfaz heredada.
Interfaz en C #:
La interfaz en C # es casi similar a la interfaz en Java, excepto:
- La interfaz en C # no declara variables.
- El nombre de la interfaz tiene el prefijo I mayúscula y se hereda con un signo de dos puntos (:).
La forma general de implementar una interfaz en C #:
class class_name: interface_name {// class-body}
Definición de clase abstracta
Una clase que contiene uno o más métodos abstractos se denomina clase abstracta, y una clase se declara como abstracta utilizando la palabra clave "abstracto", precedida por la palabra clave "clase" al comienzo de la declaración de clase. Como la clase abstracta contiene el método abstracto, constituye un tipo incompleto. Por lo tanto, no puede crear objetos de una clase abstracta. Cada vez que una clase hereda una clase abstracta, debe implementar todos los métodos abstractos de la clase abstracta; de lo contrario, también debe declararse como abstracto. El atributo abstracto se hereda hasta que se logra la implementación completa de los métodos abstractos.
La clase abstracta también puede contener métodos concretos que pueden ser utilizados por la clase derivada tal como es. Pero, no puede declarar un constructor abstracto o un método estático abstracto dentro de una clase abstracta. La forma general de la clase abstracta en Java es la siguiente:
abstract class class_name {abstract method_name1 (); abstract method_name2 (); : return_type method_name3 (lista de parámetros) {// método concreto} return_type method_name4 (lista de parámetros) {// método concreto}};
El concepto de una clase abstracta es similar tanto en Java como en C #. Una clase abstracta es ligeramente diferente en C ++.
En C ++, si una clase tiene al menos una función virtual, la clase se convierte en una clase abstracta. En lugar de la palabra clave "abstracto", la palabra clave "virtual" se utiliza para declarar un método abstracto.
Diferencias clave entre la interfaz y la clase abstracta en Java y C #
- Cuando tenga conocimiento de "lo que se requiere" pero no de "cómo se implementaría", entonces se debe utilizar la interfaz. Por otro lado, si sabe lo que se requiere y si sabe parcialmente cómo se implementaría, utilice una clase abstracta.
- Una interfaz tiene todos sus métodos abstractos, pero una clase abstracta tiene algunos métodos abstractos y algunos métodos concretos.
- Los métodos dentro de una interfaz son públicos y abstractos, por lo tanto, también se denomina como una clase abstracta pura. Por otro lado, los métodos dentro de un resumen no están restringidos a ser públicos y abstractos solamente.
- Un método de interfaz nunca puede ser privado, protegido, final, estático, sincronizado, nativo o estricto. Por otro lado, no hay restricciones a los métodos de una clase abstracta.
- Las variables en una interfaz son públicas y finales, ya sea que las declaremos o no, mientras que, no existe tal restricción para que las variables de una clase abstracta sean públicas y finales solamente.
- Las variables en una interfaz nunca pueden ser transitorias o volátiles con protección privada, mientras que no hay restricción a las variables en una clase abstracta.
- La variable de una interfaz debe inicializarse durante la declaración. Por otro lado, las variables en una clase abstracta se pueden inicializar en cualquier momento.
- Dentro de una interfaz, no se puede declarar una instancia o un bloque estático, pero puede declarar una instancia o un bloque estático dentro de una clase abstracta.
- No puede definir constructor dentro de una interfaz mientras que, puede definir constructor dentro de una clase abstracta.
Conclusión:
Cuando necesita crear una clase base que contenga una forma generalizada de métodos que puedan ser implementados por las clases derivadas de acuerdo con sus necesidades, el concepto de interfaz y clase abstracta ayuda a hacerlo.