Pregunta ¿Cuál es la diferencia entre una interfaz y una clase abstracta?


¿Cuál es exactamente la diferencia entre una interfaz y una clase abstracta?


1468
2017-12-16 08:15


origen


Respuestas:


Interfaces

Una interfaz es una contrato: La persona que escribe la interfaz dice "hey, acepto las cosas que miran de esa manera", y la persona que usa la interfaz dice"OK, la clase que escribo se ve de esa manera".

Una interfaz es un shell vacío. Solo hay firmas de los métodos, lo que implica que los métodos no tienen un cuerpo. La interfaz no puede hacer nada. Es solo un patrón.

Por ejemplo (pseudo código):

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }


    int getFuel()
    {
        return this.fuel;
    }
}

La implementación de una interfaz consume muy poca CPU, porque no es una clase, solo un montón de nombres, y por lo tanto no hay una búsqueda costosa para hacer. Es genial cuando es importante, como en los dispositivos integrados.


Clases abstractas

Las clases abstractas, a diferencia de las interfaces, son clases. Son más caros de usar, porque hay una búsqueda que hacer cuando heredas de ellos.

Las clases abstractas se parecen mucho a las interfaces, pero tienen algo más: puede definir un comportamiento para ellas. Se trata más de una persona que dice: "estas clases deberían verse así, y tienen eso en común, ¡así que complete los espacios en blanco!".

Por ejemplo:

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

Implementación

Si bien se supone que las clases abstractas y las interfaces son conceptos diferentes, las implementaciones hacen que esa declaración a veces sea falsa. A veces, ni siquiera son lo que crees que son.

En Java, esta regla se aplica con fuerza, mientras que en PHP, las interfaces son clases abstractas sin método declarado.

En Python, las clases abstractas son más un truco de programación que puedes obtener del módulo ABC y en realidad está utilizando metaclases y, por lo tanto, clases. Y las interfaces están más relacionadas con el tipado de patos en este idioma y es una mezcla entre convenciones y métodos especiales que llaman descriptores (los métodos __method__).

Como es habitual con la programación, hay teoría, práctica y práctica en otro idioma :-)


1966
2017-12-16 08:37



Las diferencias técnicas clave entre un clase abstracta y un interfaz son:

  • Las clases abstractas pueden tener constantes, miembros, trozos de método (métodos sin cuerpo) y métodos definidos, mientras que las interfaces solo pueden tener constantes y talones de métodos.

  • Los métodos y miembros de una clase abstracta se pueden definir con cualquier visibilidad, mientras que todos los métodos de una interfaz deben definirse como public (se definen públicas por defecto).

  • Al heredar una clase abstracta, una hormigón clase de niños debe definir los métodos abstractos, mientras que una clase abstracta puede extender otra clase abstracta y los métodos abstractos de la clase padre no tienen que definirse.

  • Del mismo modo, una interfaz que extiende otra interfaz es no responsable de implementar métodosdesde la interfaz principal. Esto se debe a que las interfaces no pueden definir ninguna implementación.

  • Una clase infantil solo puede extender una sola clase (abstracto o concreto), mientras que una interfaz puede extenderse o una clase puede implementar múltiples otras interfaces.

  • Una clase infantil puede definir métodos abstractos con el visibilidad igual o menos restrictiva, mientras que una clase que implementa una interfaz debe definir los métodos con la misma visibilidad exacta (pública).


749
2017-12-16 10:11



Una interfaz contiene solo la definición / firma de funcionalidad, y si tenemos alguna funcionalidad común, así como firmas comunes, entonces necesitamos usar una clase abstracta. Al usar una clase abstracta, podemos proporcionar tanto el comportamiento como la funcionalidad al mismo tiempo. Otro desarrollador que hereda clase abstracta puede usar esta funcionalidad fácilmente, ya que solo necesitarían completar los espacios en blanco.

enter image description here

Tomado de:

http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html

http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html


108
2017-09-15 08:59



Una explicación se puede encontrar aquí: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Una clase abstracta es una clase que es   solo parcialmente implementado por   programador. Puede contener uno o más   métodos abstractos. Un método abstracto   es simplemente una definición de función que   sirve para decirle al programador que   método debe ser implementado en un niño   clase.

Una interfaz es similar a un resumen   clase; de hecho, las interfaces ocupan el   el mismo espacio de nombres que las clases y el resumen   clases Por ese motivo, no puedes   definir una interfaz con el mismo nombre   como una clase. Una interfaz es completamente   clase abstracta; ninguno de sus métodos   se implementan y en lugar de una clase   subclasificación de ella, se dice que   implementar esa interfaz.

De todos modos, encuentro que esta explicación de interfaces es algo confusa. Una definición más común es: Una interfaz define un contrato que las clases de implementación deben cumplir. Una definición de interfaz consiste en firmas de miembros públicos, sin ningún código de implementación.


76
2017-12-16 08:18



Algunas diferencias importantes:

En forma de una tabla:

Difference

Como declarado por Joe desde javapapers:

1. La principal diferencia es que los métodos de una interfaz Java son implícitamente abstractos y no pueden tener implementaciones. Una clase abstracta de Java puede   tener métodos de instancia que implementan un comportamiento predeterminado.

2. Las variables declaradas en una interfaz Java son predeterminadas por defecto. Una clase abstracta puede contener variables no finales.

3. Los miembros de una interfaz Java son públicos por defecto. Una clase abstracta de Java puede tener los sabores habituales de los miembros de la clase como privado,   protegido, etc.

4. La interfaz Java debe implementarse usando la palabra clave "implements"; Una clase abstracta de Java debería extenderse usando la palabra clave "extends".

5. Una interfaz puede extender otra interfaz Java solamente, una clase abstracta puede extender otra clase Java e implementar múltiples Java   interfaces.

6. Una clase Java puede implementar múltiples interfaces pero puede extender solo una clase abstracta.

7. La interfaz es absolutamente abstracta y no puede ser instanciada; Una clase abstracta de Java tampoco puede ser instanciada, pero puede invocarse si   main () existe.

8. En comparación con las clases abstractas de Java, las interfaces de Java son lentas ya que requieren una indirección adicional.


36
2018-05-16 05:55



No quiero resaltar las diferencias, que ya se han dicho en muchas respuestas (con respecto a los modificadores finales públicos estáticos para variables en la interfaz y el soporte para métodos privados protegidos en clases abstractas)

En términos simples, me gustaría decir:

interfaz: Para implementar un contrato por múltiples objetos no relacionados

clase abstracta: Para implementar el mismo o diferente comportamiento entre múltiples objetos relacionados

Del Oráculo documentación

Considera usar clases abstractas Si :

  1. Desea compartir el código entre varias clases estrechamente relacionadas.
  2. Espera que las clases que amplían su clase abstracta tengan muchos métodos o campos comunes, o que requieran modificadores de acceso que no sean públicos (como protegidos y privados).
  3. Desea declarar campos no estáticos o no finales.

Considere usar interfaces Si :

  1. Esperas que las clases no relacionadas implementen tu interfaz. Por ejemplo, muchos objetos no relacionados pueden implementar Serializable interfaz.
  2. Desea especificar el comportamiento de un tipo de datos particular, pero no le preocupa quién implementa su comportamiento.
  3. Desea aprovechar la herencia múltiple de tipo.

clase abstracta establece "es una" relación con clases concretas. la interfaz proporciona la capacidad "tiene una" para las clases.

Si usted está buscando Java como lenguaje de programación, aquí hay algunas actualizaciones más:

Java 8 ha reducido la brecha entre interface y abstract clases en cierta medida proporcionando un default característica del método Una interfaz no tiene una implementación para un método ya no es válido ahora.

Consulte esta documentación página para más detalles.

Eche un vistazo a esta pregunta SE para ejemplos de códigos para comprender mejor.

¿Cómo debería haber explicado la diferencia entre una interfaz y una clase abstracta?


34
2017-11-27 12:42



El punto principal es que:

  • El resumen está orientado a objetos. Ofrece los datos básicos que un 'objeto' debería tener y / o funciones que debería poder hacer. Se ocupa de las características básicas del objeto: qué tiene y qué puede hacer. Por lo tanto, los objetos que heredan de la misma clase abstracta comparten las características básicas (generalización).
  • La interfaz está orientada a la funcionalidad. Define las funcionalidades que un objeto debería tener. Independientemente de qué objeto sea, siempre que pueda hacer estas funcionalidades, que se definen en la interfaz, está bien. Ignora todo lo demás. Un objeto / clase puede contener varias (grupos de) funcionalidades; por lo tanto, es posible que una clase implemente interfaces múltiples.

22
2017-09-29 09:54



Cuando desee proporcionar un comportamiento polimórfico en una jerarquía de herencia, use clases abstractas.

Cuando desee comportamiento polimórfico para clases que no están relacionadas, use una interfaz.


20
2018-05-28 04:42