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

Resuelto Sarfraz asked hace 14 años • 38 respuestas

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

Sarfraz avatar Dec 16 '09 15:12 Sarfraz
Aceptado

Interfaces

Una interfaz es un contrato : la persona que escribe la interfaz dice: " Oye, acepto que las cosas se vean así ", y la persona que usa la interfaz dice " OK, la clase que escribo se ve así ".

Una interfaz es un shell vacío . Sólo están las firmas de los métodos, lo que implica que los métodos no tienen cuerpo. La interfaz no puede hacer nada. Es sólo un patrón.

Por ejemplo (pseudocó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 es necesario realizar ninguna búsqueda costosa. Es fantástico 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 que hacer una búsqueda cuando se hereda de ellos.

Las clases abstractas se parecen mucho a las interfaces, pero tienen algo más: puedes 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 completa 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 e interfaces abstractas son conceptos diferentes, las implementaciones hacen que esa afirmación a veces sea falsa. A veces ni siquiera son lo que crees que son.

En Java, esta regla se aplica estrictamente, mientras que en PHP, las interfaces son clases abstractas sin ningún método declarado.

En Python, las clases abstractas son más un truco de programación que puede obtener del módulo ABC y en realidad utilizan metaclases y, por lo tanto, clases. Y las interfaces están más relacionadas con la escritura pato en este lenguaje y es una mezcla entre convenciones y métodos especiales que llaman a descriptores (los métodos __method__).

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

Bite code avatar Dec 16 '2009 08:12 Bite code

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

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

  • 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 como públicos de forma predeterminada).

  • Al heredar una clase abstracta, una clase secundaria concreta debe definir los métodos abstractos , mientras que una clase abstracta puede extender otra clase abstracta y no es necesario definir métodos abstractos de la clase principal.

  • De manera similar, una interfaz que extiende otra interfaz no es responsable de implementar métodos desde la interfaz principal. Esto se debe a que las interfaces no pueden definir ninguna implementación.

  • Una clase secundaria solo puede extender una única clase (abstracta o concreta), mientras que una interfaz puede extenderse o una clase puede implementar muchas otras interfaces .

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

Justin Johnson avatar Dec 16 '2009 10:12 Justin Johnson