¿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?

Author: brice, 2009-12-16

30 answers

Interfaces

Una interfaz es un contrato: La persona que escribe la interfaz dice, " oye, acepto que las cosas se vean 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 las firmas de los métodos, lo que implica que los métodos no tienen un cuerpo. La interfaz no puede hacer nada. Es sólo 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;
    }
}

Implementar una interfaz consume muy poca CPU, porque no es una clase, solo un montón de nombres, y por lo tanto no hay ninguna búsqueda costosa que hacer. Es genial cuando importa, como en 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 se hereda de ellos.

Las clases abstractas se parecen mucho a las interfaces, pero ten algo más: Puedes definir un comportamiento para ellos. Se trata más de una persona que dice: "estas clases deberían verse así, y tienen eso en común, ¡así que rellene 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");
    }
}

Aplicación

Mientras que 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 usted piensa.

En Java, esta regla es fuertemente forzada, 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 puede obtener del módulo ABC y en realidad está usando metaclases, y por lo tanto clases. Y las interfaces están más relacionadas con el duck typing en este lenguaje y es una mezcla entre convenciones y métodos especiales que llaman descriptores(los métodos__ method__).

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

 2002
Author: e-satis,
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
2018-05-16 02:56:36

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

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

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

  • 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 los métodos abstractos de la clase padre no tienen que ser definidos.

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

  • Una clase hija solo puede extender una sola clase (abstracta u concreta), mientras que una interfaz puede extender o una clase puede implementar varias otras interfaces.

  • Una clase hija puede definir métodos abstractos con la 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).

 777
Author: Justin Johnson,
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
2016-11-20 14:14:29

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. Mediante el uso de una clase abstracta, podemos proporcionar tanto el comportamiento como la funcionalidad al mismo tiempo. Otro desarrollador que hereda la clase abstracta puede usar esta funcionalidad fácilmente, ya que solo necesitaría rellenar los espacios en blanco.

introduzca la descripción de la imagen aquí

Tomada 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

 115
Author: Vivek,
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
2016-06-30 17:42:28

Se puede encontrar una explicación 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 aplicado sólo parcialmente por el 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 el método debe ser implementado en un niño clase.

An la interfaz es similar a un resumen clase; de hecho las interfaces ocupan mismo espacio de nombres que classes y abstract clase. Por esa razón, no se puede definir una interfaz con el mismo nombre como 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 esta explicación de las interfaces algo confusa. Una definición más común es: An interface 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.

 77
Author: Konamiman,
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-12-16 08:24:10

Algunas diferencias importantes:

En forma de tabla:

Diferencia

Como declaró Joe de 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 tenga métodos de instancia que implementen un comportamiento predeterminado.

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

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

4.La interfaz Java debe ser implementada usando la palabra clave "implements" ; Una clase abstracta Java debe ser extendida usando la palabra clave "extends".

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

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

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

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

 37
Author: softmage99,
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
2013-10-14 19:53:02

No quiero resaltar las diferencias, que ya se han dicho en muchas respuestas (con respecto a los modificadores finales estáticos públicos 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

De la Oracle documentación

Considere usar clases abstractas si:

  1. desea compartir código entre varias clases estrechamente relacionadas.
  2. Se espera que las clases que amplían su clase abstracta tengan muchos métodos o campos comunes, o que requieran modificadores de acceso distintos a los públicos (como protected y private).
  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 la interfaz Serializable.
  2. Desea especificar el comportamiento de un tipo de datos en particular, pero sin preocuparse por quién implementa su comportamiento.
  3. Desea aprovechar la herencia múltiple de tipo.

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

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

Java 8 ha reducido la brecha entre las clases interface y abstract hasta cierto punto al proporcionar una característica de método default. Una interfaz no tiene una implementación para un método ya no es válida ahora.

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

Eche un vistazo a esta pregunta SE para ver ejemplos de código para entender mejor.

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

 35
Author: Ravindra babu,
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
2017-05-23 12:34:53

El punto principal es que:

  • El resumen está orientado a objetos. Ofrece los datos básicos que un' objeto ' debe tener y / o las funciones que debe ser capaz de hacer. Se trata de las características básicas del objeto: lo que tiene y lo que 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 debe tener. Sin importar lo que objeto es, siempre y cuando pueda hacer estas funcionalidades, que se definen en la interfaz, está bien. Ignora todo lo demás. Un objeto / clase puede contener varios (grupos de) funcionalidades; por lo tanto, es posible que una clase implemente múltiples interfaces.
 25
Author: Yusup,
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
2016-06-30 17:48:12

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

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

 22
Author: sculptor,
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
2016-11-20 14:21:38

Estoy construyendo un edificio de 300 pisos

El plano del edificio interfaz

  • Por ejemplo, Servlet(I)

Edificio construido hasta 200 pisos - parcialmente terminado - - - resumen

  • Implementación parcial, por ejemplo, servlet genérico y HTTP

Construcción terminada - hormigón

  • Implementación completa, por ejemplo, servlet propio

Interfaz

  • No sabemos nada sobre implementación, solo requisitos. Podemos busca una interfaz.
  • Cada método es público y abstracto por defecto
  • Es una clase abstracta 100% pura
  • Si declaramos público no podemos declarar privado y protegido
  • Si declaramos abstracto no podemos declarar final, estático, sincronizado, strictfp y nativo
  • Cada interfaz tiene público, estático y final
  • Serialización y transient no es aplicable, porque no podemos crear una instancia para in interfaz
  • No volátil porque es final
  • Cada variable es estática
  • Cuando declaramos una variable dentro de una interfaz necesitamos inicializar variables mientras declaramos
  • Instancia y bloque estático no permitidos

Resumen

  • Aplicación parcial
  • tiene un método abstracto. Una adición, utiliza hormigón
  • No hay restricción para el método de clase abstracta modificadores
  • No hay restricción para los modificadores de variables de clase abstractas
  • No podemos declarar otros modificadores excepto abstract
  • No hay restricción para inicializar variables

Tomado del sitio web de DurgaJobs

 22
Author: Jaichander,
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
2018-04-01 09:35:05

Trabajemos de nuevo en esta pregunta:

Lo primero que debes saber es que 1/1 y 1*1 dan como resultado lo mismo, pero no significa que la multiplicación y la división sean iguales. Obviamente, tienen una buena relación, pero ten en cuenta que ambos son diferentes.

Señalaré las principales diferencias, y el resto ya se han explicado:

Las clases abstractas son útiles para modelar una jerarquía de clases. A primera vista de cualquier requisito, estamos parcialmente claros en lo que exactamente se va a construir, pero sabemos qué construir. Y así sus clases abstractas son sus clases base.

Las interfaces son útiles para permitir que otras jerarquías o clases sepan lo que soy capaz de hacer. Y cuando dices que soy capaz de algo, debes tener esa capacidad. Las interfaces lo marcarán como obligatorio para una clase implementar las mismas funcionalidades.

 18
Author: Dhananjay,
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
2016-11-20 14:18:24

Es bastante simple en realidad.

Puede pensar en una interfaz como una clase a la que solo se le permite tener métodos abstractos y nada más.

Así que una interfaz solo puede "declarar" y no definir el comportamiento que desea que tenga la clase.

Una clase abstracta le permite declarar (usando métodos abstractos) así como definir (usando implementaciones completas de métodos) el comportamiento que desea que tenga la clase.

Y una clase regular solo le permite definir, no declare, el comportamiento / acciones que desea que tenga la clase.

Una última cosa,

En Java, puede implementar múltiples interfaces, pero solo puede extender una (Clase Abstracta o Clase)...

Esto significa que la herencia del comportamiento definido está restringida a permitir solo uno por clase... es decir, si desea una clase que encapsule el comportamiento de las Clases A, B y C, debe hacer lo siguiente: La clase A extiende B, la Clase C extiende A .. es un poco de una forma redonda de tener múltiples herencia...

Interfaces por otro lado, simplemente podría hacer: interfaz C implementa A, B

Así que en efecto Java soporta herencia múltiple solo en interfaces ie de "comportamiento declarado", y solo herencia única con comportamiento definido.. a menos que hagas la ronda como te describí...

Esperemos que eso tenga sentido.

 12
Author: g00dnatur3,
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
2017-03-17 22:31:14

La comparación entre interfaz y clase abstracta es incorrecta. Debería haber otras dos comparaciones: 1) interfaz vs.clase y 2) resumen vs. clase final .

Interfaz vs Clase

Interface es un contrato entre dos objetos. Por ejemplo, soy cartero y tú eres un Paquete para entregar. Espero que sepa su dirección de entrega. Cuando alguien me da un Paquete, tiene que saber su dirección de entrega:

interface Package {
  String address();
}

Class es un grupo de objetos que obedecen al contrato. Por ejemplo, soy una caja del grupo "Caja" y obedezco el contrato requerido por el Cartero. Al mismo tiempo obedezco otros contratos:

class Box implements Package, Property {
  @Override
  String address() {
    return "5th Street, New York, NY";
  }
  @Override
  Human owner() {
    // this method is part of another contract
  }
}

Resumen vs Final

Abstract class es un grupo de objetos incompletos. No se pueden usar, porque faltan algunas partes. Por ejemplo, soy un cuadro abstracto GPS-aware-Sé cómo comprobar mi posición en el mapa:

abstract class GpsBox implements Package {
  @Override
  public abstract String address();
  protected Coordinates whereAmI() {
    // connect to GPS and return my current position
  }
}

Esta clase, si es heredada/extendida por otra clase, puede ser muy útil. Pero por en sí mismo-es inútil, ya que no puede tener objetos. Las clases abstractas pueden ser elementos de construcción de las clases finales.

La clase final es un grupo de objetos completos, que se pueden usar, pero no se pueden modificar. Saben exactamente cómo trabajar y qué hacer. Por ejemplo, soy una Caja que siempre va a la dirección especificada durante su construcción:

final class DirectBox implements Package {
  private final String to;
  public DirectBox(String addr) {
    this.to = addr;
  }
  @Override
  public String address() {
    return this.to;
  }
}

En la mayoría de lenguajes, como Java o C++, es posible tener solo una clase, ni abstracta ni final. Tal clase puede ser heredado y puede ser instanciado. Sin embargo, no creo que esto esté estrictamente en línea con el paradigma orientado a objetos.

De nuevo, comparar interfaces con clases abstractas no es correcto.

 9
Author: yegor256,
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-07-24 21:57:49

La única diferencia es que uno puede participar en la herencia múltiple y otro no.

La definición de una interfaz ha cambiado con el tiempo. ¿Crees que una interfaz solo tiene declaraciones de métodos y son solo contratos? ¿Qué pasa con las variables finales estáticas y qué pasa con las definiciones predeterminadas después de Java 8?

Las interfaces se introdujeron en Java debido a el problema del diamante con herencia múltiple y eso es lo que realmente pretenden hacer.

Las interfaces son las construcciones que se crearon para salirse con la suya con el problema de herencia múltiple y pueden tener métodos abstractos, definiciones predeterminadas y variables finales estáticas.

Véase ¿Por qué Java permite variables finales estáticas en interfaces cuando solo están destinadas a ser contratos?.

 9
Author: Vivek Vermani,
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
2016-12-05 16:44:22

En resumen, las diferencias son las siguientes:

Diferencias sintácticas Entre Interfaz y Clase Abstracta :

  1. Los métodos y los miembros de una clase abstracta pueden tener cualquier visibilidad. Todos los métodos de una interfaz deben ser públicos. / / Ya no se aplica a Java 9
  2. Una clase hija concreta de una Clase Abstract debe definir todos los métodos abstractos. Una clase secundaria Abstract puede tener métodos abstractos. Una interfaz que extienda otra interfaz no necesita proporcionar una implementación predeterminada para los métodos heredados de la interfaz padre.
  3. Una clase hija solo puede extender una sola clase. Una interfaz puede extender múltiples interfaces. Una clase puede implementar múltiples interfaces.
  4. Una clase hija puede definir métodos abstractos con la misma o menos restrictiva visibilidad, mientras que la clase que implementa una interfaz debe definir todos métodos de interfaz como públicos.
  5. Las clases abstractaspueden tener constructores pero no interfaces.
  6. Las interfaces de Java 9 tienen métodos estáticos privados.

En Interfaces ahora:

public static - compatible
public abstract - compatible
public default - compatible
private static - compatible
private abstract - error de compilación
private default - error de compilación
private - apoyado

 8
Author: Pritam Banerjee,
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
2017-10-27 05:18:44

Interfaz: Gire ( Gire a la Izquierda, Gire a la Derecha.)

Clase abstracta: Rueda.

Clase: Volante, deriva del volante, expone Interfaz Turn

Una es para categorizar el comportamiento que se puede ofrecer a través de una amplia gama de cosas, la otra es para modelar una ontología de cosas.

 7
Author: Sentinel,
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
2017-03-06 21:46:53

No es realmente la respuesta a la pregunta original, pero una vez que tenga la respuesta a la diferencia entre ellas, ingresará el dilema de cuándo usar cada una: ¿Cuándo usar interfaces o clases abstractas? ¿Cuándo usar ambos?

Tengo un conocimiento limitado de OOP, pero ver las interfaces como un equivalente de un adjetivo en gramática ha funcionado para mí hasta ahora (corrígeme si este método es falso!). Por ejemplo, los nombres de interfaz son como atributos o capacidades que puede dar a una clase, y una clase puede tener muchos de ellos: ISerializable, ICountable, IList, ICacheable, iHappy,...

 4
Author: azkotoki,
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
2017-05-23 12:02:57

Si tiene algunos métodos comunes que pueden ser utilizados por varias clases, vaya a clases abstractas. De lo contrario, si desea que las clases sigan algún modelo definido, vaya a las interfaces.

Los siguientes ejemplos demuestran esto.

Clase abstracta en Java:

abstract class animals
{
    // They all love to eat. So let's implement them for everybody
    void eat()
    {
        System.out.println("Eating...");
    }
    // The make different sounds. They will provide their own implementation.
    abstract void sound();
}

class dog extends animals
{
    void sound()
    {
        System.out.println("Woof Woof");
    }
}

class cat extends animals
{
    void sound()
    {
        System.out.println("Meoww");
    }
}

Lo siguiente es una implementación de interfaz en Java:

interface Shape
{
    void display();
    double area();
}

class Rectangle implements Shape 
{
    int length, width;
    Rectangle(int length, int width)
    {
        this.length = length;
        this.width = width;
    }
    @Override
    public void display() 
    {
        System.out.println("****\n* *\n* *\n****"); 
    }
    @Override
    public double area() 
    {
        return (double)(length*width);
    }
} 

class Circle implements Shape 
{
    double pi = 3.14;
    int radius;
    Circle(int radius)
    {
        this.radius = radius;
    }
    @Override
    public void display() 
    {
        System.out.println("O"); // :P
    }
    @Override
    public double area() 
    { 
        return (double)((pi*radius*radius)/2);
    }
}

Algunos puntos clave importantes en pocas palabras:

  1. Las variables declaradas en la interfaz Java son por defecto finales. Abstracto las clases pueden tener variables no finales.

  2. Las variables declaradas en la interfaz Java son por defecto estáticas. Las clases abstractas pueden tener variables no estáticas.

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

 4
Author: Pransh Tiwari,
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
2017-10-03 06:25:57

La herencia se usa para dos propósitos:

  • Para permitir que un objeto considere miembros de datos de tipo padre e implementaciones de métodos como propios.

  • Para permitir que una referencia a un objeto de un tipo sea utilizada por código que espera una referencia al objeto supertipo.

En lenguajes/frameworks que soportan herencia múltiple generalizada, a menudo hay poca necesidad de clasificar un tipo como una "interfaz" o una "clase abstracta". Popular los lenguajes y frameworks, sin embargo, permitirán que un tipo considere los miembros de datos o implementaciones de métodos de otro tipo como propios, aunque permitan que un tipo sea sustituible por un número arbitrario de otros tipos.

Las clases abstractas pueden tener miembros de datos e implementaciones de métodos, pero solo pueden ser heredadas por clases que no heredan de ninguna otra clase. Las interfaces no ponen casi ninguna restricción en los tipos que las implementan, pero no pueden incluir ningún miembro de datos o método aplicación.

Hay veces en que es útil que los tipos sean sustituibles por muchas cosas diferentes; hay otras veces en que es útil que los objetos consideren miembros de datos de tipo padre e implementaciones de métodos como propios. Hacer una distinción entre interfaces y clases abstractas permite que cada una de esas habilidades se use en los casos en que sea más relevante.

 3
Author: supercat,
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
2013-09-03 16:09:55

Puntos clave:

  • La clase abstracta puede tener propiedades, campos de datos, Métodos (completo / incompleto) ambos.
  • Si el método o las propiedades definen en la palabra clave abstracta que debe sobrescribirse en la clase derivada.(su trabajo como un bien acoplado funcionalidad)
  • Si define la palabra clave abstracta para el método o las propiedades en la clase abstracta, no puede definir el cuerpo del método y obtener/establecer el valor para propiedades y que deben sobreescribirse en clase derivada.
  • La clase abstracta no admite herencia múltiple.
  • La clase abstracta contiene Constructores.
  • Una clase abstracta puede contener modificadores de acceso para los subs, funciones, propiedades.
  • Solo el Miembro Completo de la clase abstracta puede ser estático.
  • Una interfaz solo puede heredar de otra interfaz y no puede heredar de una clase abstracta, donde como una clase abstracta puede heredar de otra clase abstracta u otra interfaz.

Ventaja:

  • Es una especie de contrato que obliga a todas las subclases a seguir las mismas jerarquías o estándares.
  • Si varias implementaciones son del mismo tipo y usan un comportamiento o estado común, entonces es mejor usar clase abstracta.
  • Si agregamos un nuevo método a una clase abstracta, entonces tenemos la opción de proporcionar implementación predeterminada y, por lo tanto, todo el código existente podría funcionar correctamente.
  • Su permitir la ejecución rápida de interfaz.(interfaz Requiere más tiempo para encontrar el método real en el clases correspondientes.)
  • Se puede usar para acoplamiento apretado y suelto.

Encuentra los detalles aquí... http://pradeepatkari.wordpress.com/2014/11/20/interface-and-abstract-class-in-c-oops /

 3
Author: Pradeep atkari,
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-12-05 10:00:14

La forma más corta de resumirlo es que un interface es:

  1. Totalmente abstracto, aparte de los métodos default y static; mientras que tiene definiciones (firmas de métodos + implementaciones) para los métodos default y static, solo tiene declaraciones (firmas de métodos) para otros métodos.
  2. Sujeto a reglas más laxas que las clases (una clase puede implementar múltiples interface s, y un interface puede heredar de múltiples interface s). Todas las variables son implícitamente constantes, se especifiquen como public static final o no. Todos los miembros son implícitamente public, estén o no especificados como tales.
  3. Generalmente se usa como garantía de que la clase implementadora tendrá las características especificadas y/o será compatible con cualquier otra clase que implemente la misma interfaz.

Mientras tanto, una clase abstract es:

  1. En cualquier lugar desde completamente abstracto hasta completamente implementado, con una tendencia a tener uno o más métodos abstract. Puede contener tanto declaraciones como definiciones, con declaraciones marcadas como abstract.
  2. Una clase completa, y sujeta a las reglas que gobiernan otras clases (solo puede heredar de una clase), con la condición de que no pueda ser instanciada (porque no hay garantía de que esté completamente implementada). Puede tener variables de miembro no constantes. Puede implementar el control de acceso de los miembros, restringiendo los miembros como protected, private, o paquete privado (no especificado).
  3. Generalmente se usa para proporcionar la mayor parte de la implementación que puede ser compartida por múltiples subclases, o para proporcionar tanto de la implementación como el programador es capaz de suministrar.

O, si queremos reducirlo todo a una sola oración: Un interface es lo que la clase implementadora tiene, pero una clase abstract es lo que la subclase es.

 3
Author: Justin Time,
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
2016-01-28 21:58:45

Muchos desarrolladores junior cometen el error de pensar en interfaces, clases abstractas y concretas como ligeras variaciones de la misma cosa, y eligen una de ellas puramente por motivos técnicos: ¿Necesito herencia múltiple? ¿Necesito algún lugar para poner métodos comunes? ¿Tengo que molestarme con algo más que una clase concreta? Esto está mal, y escondido en estas preguntas está el problema principal: "I". Cuando escribes código por ti mismo, por ti mismo, rara vez piense en otros desarrolladores presentes o futuros que trabajan en o con su código.

Las interfaces y las clases abstractas, aunque aparentemente similares desde un punto de vista técnico, tienen significados y propósitos completamente diferentes.

Resumen

  1. Una interfaz define un contrato que algunos implementación cumplirá para usted.

  2. Una clase abstracta proporciona un comportamiento predeterminado que su implementación puede reutilizar.

Resumen alternativo

  1. Una interfaz es para definir API públicas
  2. Una clase abstracta es para uso interno, y para definir SPIs

Sobre la importancia de ocultar detalles de implementación

Una clase concreta hace el trabajo real, de una manera muy específica. Por ejemplo, un ArrayList utiliza un área contigua de memoria para almacenar una lista de objetos de una manera compacta que ofrece acceso aleatorio rápido, iteración y en el lugar mientras tanto, un LinkedList utiliza nodos de doble enlace para almacenar una lista de objetos, que en su lugar ofrece iteración rápida, cambios en el lugar e inserción/eliminación/adición, pero es terrible en el acceso aleatorio. Estos dos tipos de listas están optimizados para diferentes casos de uso, y importa mucho cómo las vaya a usar. Cuando estás tratando de exprimir el rendimiento de una lista con la que estás interactuando fuertemente, y cuando elegir el tipo de lista depende de usted, debe elegir cuidadosamente cuál está instanciando.

Por otro lado, a los usuarios de alto nivel de una lista realmente no les importa cómo se implementa realmente, y deben estar aislados de estos detalles. Imaginemos que Java no expuso la interfaz List, sino que solo tenía una clase List concreta que es en realidad lo que es LinkedList en este momento. Todos los desarrolladores de Java habrían adaptado su código para que se ajustara a los detalles de la implementación: evite el acceso aleatorio, agregue una caché para acelerar el acceso, o simplemente reimplemente ArrayList por su cuenta, aunque sería incompatible con todo el otro código que realmente funciona solo con List. Eso sería terrible... Pero ahora imagine que los maestros de Java realmente se dan cuenta de que una lista vinculada es terrible para la mayoría de los casos de uso reales, y decidieron cambiar a una lista de matrices para su única clase List disponible. Esto afectaría el rendimiento de todos los programas Java en el mundo, y la gente no estaría contenta con ello. Y el principal culpable es que los detalles de implementación estaban disponibles, y los desarrolladores asumieron que esos detalles son un contrato permanente en el que pueden confiar. Esta es la razón por la que es importante ocultar los detalles de la implementación, y solo definir un contrato abstracto. Este es el propósito de una interfaz: definir qué tipo de entrada acepta un método y qué tipo de salida se espera, sin exponer todas las agallas que tentarían a los programadores a modificar su código para adaptarse a los detalles internos que podrían cambie con cualquier actualización futura.

Una clase abstracta está en el medio entre interfaces y clases concretas. Se supone que ayuda a las implementaciones a compartir código común o aburrido. Por ejemplo, AbstractCollection proporciona implementaciones básicas para isEmpty basadas en el tamaño es 0, contains como iterar y comparar, addAll como repetir add, y así sucesivamente. Esto permite que las implementaciones se centren en las partes cruciales que las diferencian: cómo almacenar y recuperar datos.

APIs versus SPIs

Las interfaces son puertas de enlace de baja cohesión entre diferentes partes del código. Permiten que las bibliotecas existan y evolucionen sin interrumpir a cada usuario de la biblioteca cuando algo cambia internamente. Se llama Interfaz de Programación de aplicaciones , no Clases de Programación de Aplicaciones. En una escala más pequeña, también permiten que varios desarrolladores colaboren con éxito en proyectos a gran escala, separando diferentes módulos a través de interfaz.

Las clases abstractas son ayudantes de alta cohesión que se utilizan cuando se implementa una interfaz, asumiendo algún nivel de detalles de implementación. Alternativamente, las clases abstractas se utilizan para definir SPI, Interfaces de Proveedores de Servicios.

La diferencia entre una API y una SPI es sutil, pero importante: para una API, el foco está en quién la usa, y para una SPI el foco está en quién la implementa.

Agregar métodos a una API es fácil, todos los usuarios existentes de la API aún compilarán. Agregar métodos a un SPI es difícil, ya que cada proveedor de servicios (implementación concreta) tendrá que implementar los nuevos métodos. Si se utilizan interfaces para definir un SPI, un proveedor tendrá que lanzar una nueva versión cada vez que cambie el contrato SPI. Si se usan clases abstractas en su lugar, los nuevos métodos podrían definirse en términos de métodos abstractos existentes, o como stubs vacíos throw not implemented exception, lo que al menos permitirá una versión anterior de un implementación del servicio para compilar y ejecutar.

Una nota sobre Java 8 y métodos por defecto

Aunque Java 8 introdujo métodos predeterminados para interfaces, lo que hace que la línea entre interfaces y clases abstractas sea aún más borrosa, esto no fue para que las implementaciones puedan reutilizar el código, sino para facilitar el cambio de interfaces que sirven tanto como API como SPI (o que se usan erróneamente para definir SPI en lugar de clases abstractas).

¿Cuál a ¿usar?

  1. ¿Se supone que la cosa debe ser utilizada públicamente por otras partes del código, o por otro código externo? Agregue una interfaz para ocultar los detalles de la implementación del contrato abstracto público, que es el comportamiento general de la cosa.
  2. ¿Es la cosa algo que se supone que tiene múltiples implementaciones con mucho código en común? Hacer tanto una interfaz como una implementación abstracta e incompleta.
  3. ¿Hay ¿alguna vez va a haber solo una implementación, y nadie más la usará? Que sea una clase concreta.
    1. "siempre" es mucho tiempo, puedes jugar a lo seguro y aún así agregar una interfaz encima.

Un corolario: lo contrario a menudo se hace incorrectamente: cuando se usa una cosa , siempre intente usar la clase/interfaz más genérica que realmente necesite. En otras palabras, no declare sus variables como ArrayList theList = new ArrayList(), a menos que realmente tenga una muy fuerte dependencia de que sea una lista array, y ningún otro tipo de lista lo cortaría por usted. Use List theList = new ArrayList en su lugar, o incluso Collection theCollection = new ArrayList si el hecho de que sea una lista, y no cualquier otro tipo de colección no importa realmente.

 3
Author: Sergiu Dumitriu,
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
2016-06-19 09:02:34

Por definición, las interfaces no pueden tener una implementación para ningún método, y las variables miembro no pueden inicializarse.

Sin embargo, las clases abstractas pueden tener métodos implementados y variables miembro inicializadas.

Use clases abstractas cuando espere cambios en su contrato, es decir, digamos que en el futuro podría necesitar agregar un nuevo método.

En esta situación, si decide usar una interfaz, cuando la interfaz se cambie para incluir interfaz, su aplicación romper cuando se volcó la nueva interfaz dll.

Para leer en detalle, visite diferencia entre clase abstracta y una interfaz

 3
Author: Ranganatha,
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
2016-06-30 16:27:45

Me gustaría añadir una diferencia más que tiene sentido. Por ejemplo, tiene un framework con miles de líneas de código. Ahora, si desea agregar una nueva característica en todo el código utilizando un método enhanceUI(), entonces es mejor agregar ese método en clase abstracta en lugar de en interfaz. Porque, si agrega este método en una interfaz, debe implementarlo en toda la clase implementada, pero no es el caso si agrega el método en clase abstracta.

 3
Author: Toothless,
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
2016-12-15 17:47:09

Diferencias entre la clase abstracta y la interfaz en nombre de la implementación real.

Interfaz: Es una palabra clave y se usa para definir la plantilla o letra azul de un objeto y obliga a todas las subclases a seguir el mismo prototipo,en cuanto a la implementación, todas las subclases son libres de implementar la funcionalidad según su requisito.

Algunos de otros casos de uso en los que deberíamos usar interfaz.

Comunicación entre dos objetos externos (Integración de terceros en nuestra aplicación) realizados a través de Interfaz aquí la Interfaz funciona como Contrato.

Clase abstracta: Abstracta,es una palabra clave y cuando usamos esta palabra clave antes de cualquier clase, entonces se convierte en abstracta class.It se utiliza principalmente cuando necesitamos definir la plantilla así como alguna funcionalidad predeterminada de un objeto que es seguida por todas las subclases y de esta manera elimina el código redundante y uno más casos de uso donde podemos use abstract class , como queremos que ninguna otra clase pueda instanciar directamente un objeto de la clase, solo las clases derivadas pueden usar la funcionalidad.

Ejemplo de Clase Abstracta:

 public abstract class DesireCar
  {

 //It is an abstract method that defines the prototype.
     public abstract void Color();

  // It is a default implementation of a Wheel method as all the desire cars have the same no. of wheels.   
 // and hence no need to define this in all the sub classes in this way it saves the code duplicasy     

  public void Wheel() {          

               Console.WriteLine("Car has four wheel");
                }
           }


    **Here is the sub classes:**

     public class DesireCar1 : DesireCar
        {
            public override void Color()
            {
                Console.WriteLine("This is a red color Desire car");
            }
        }

        public class DesireCar2 : DesireCar
        {
            public override void Color()
            {
                Console.WriteLine("This is a red white Desire car");
            }
        }

Ejemplo De Interfaz:

  public interface IShape
        {
          // Defines the prototype(template) 
            void Draw();
        }


  // All the sub classes follow the same template but implementation can be different.

    public class Circle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("This is a Circle");
        }
    }

    public class Rectangle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("This is a Rectangle");
        }
    }
 3
Author: Sheo Dayal Singh,
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
2017-08-18 05:56:01

Puede encontrar una clara diferencia entre interfaz y clase abstracta.

Interfaz

  • La interfaz solo contiene métodos abstractos.
  • Forzar a los usuarios a implementar todos los métodos cuando implementa la interfaz.
  • Contiene solo variables finales y estáticas.
  • Declare usando la palabra clave interface.
  • Todos los métodos de una interfaz deben definirse como públicos.
  • Una interfaz puede extenderse o una clase puede implementar multiple other interfaz.

Clase Abstracta

  • La clase abstracta contiene métodos abstractos y no abstractos.

  • No obliga a los usuarios a implementar todos los métodos cuando clase abstracta.

  • Contiene todo tipo de variables incluyendo primitivo y no primitivo

  • Declarar usando palabra clave abstracta.

  • Los métodos y los miembros de una clase abstracta se pueden definir con cualquier visibilidad.

  • Una clase hija solo puede extender una sola clase (abstracta u concreta).

 3
Author: Rahul Chauhan,
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
2017-08-24 14:05:09

introduzca la descripción de la imagen aquí

Aquí hay una comprensión muy básica sobre interfaz vs clase abstracta.

 2
Author: Santosh,
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
2016-01-22 12:24:54

Una clase abstracta es una clase cuyo objeto no puede ser creado o una clase que no puede ser instanciada. Un método abstracto hace abstracta a una clase. Una clase abstracta necesita ser heredada para anular los métodos que se declaran en la clase abstracta. No hay restricción en los especificadores de acceso. Una clase abstracta puede tener métodos constructor y otros métodos concretos (no abstarct) en ellos, pero interface no puede tener.

Una interfaz es un blueprint/plantilla de métodos.(eg. Un se da la casa sobre un papel (casa de interfaz) y diferentes arquitectos usarán sus ideas para construirla(las clases de arquitectos que implementan la interfaz de la casa). Es una colección de métodos abstractos, métodos predeterminados, métodos estáticos, variables finales y clases anidadas. Todos los miembros serán finales o especificadores de acceso público , protegido y privado no son allowed.No se permite la creación de objetos. Se debe crear una clase para usar la interfaz de implementación y también para anular el método abstracto declarado en la interfaz. Una interfaz es un buen ejemplo de acoplamiento suelto(polimorfismo dinámico / unión dinámica) Una interfaz implementa polimorfismo y abstraction.It dice qué hacer pero cómo hacerlo está definido por la clase implementadora. Por Ejemplo. Hay una compañía de automóviles y quiere que algunas características sean iguales para todos los automóviles que está fabricando, por lo que la compañía estaría haciendo un vehículo de interfaz que tendrá esas características y diferentes clases de automóviles(como Maruti Suzkhi , Maruti 800) anulará esas características(funciones).

¿Por qué interfaz cuando ya tenemos clase abstracta? Java solo soporta herencia multinivel y jerárquica, pero con la ayuda de interface podemos implementar herencia múltiple.

 2
Author: Tutu Kumari,
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
2016-09-20 19:19:45

Para dar una respuesta simple pero clara, ayuda a establecer el contexto : se utilizan ambos cuando no se desea proporcionar implementaciones completas.

La principal diferencia entonces es que una interfaz no tiene implementación en absoluto (solo métodos sin cuerpo) mientras que las clases abstractas pueden tener miembros y métodos con cuerpo también, es decir, pueden implementarse parcialmente.

 2
Author: user3775501,
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
2017-06-28 10:49:48

En una interfaz todos los métodos deben ser solo definiciones, no debe implementarse una sola.

Pero en una clase abstracta debe haber un método abstracto con solo definición, pero otros métodos pueden estar también en la clase abstracta con implementación...

 1
Author: Shamim Ahmed,
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
2016-11-20 14:25:09

Leí una explicación simple pero efectiva de la clase abstracta y la Interfaz en php.net

Que es como sigue.

Una interfaz es como un protocolo. No designa el comportamiento del objeto; designa cómo su código le dice a ese objeto que actúe. Una interfaz sería como el idioma inglés: definir una interfaz define cómo su código se comunica con cualquier objeto que implementa esa interfaz.

Una interfaz es siempre un acuerdo o una promesa. Cuando una clase dice "Implemento interfaz Y", está diciendo"Prometo tener los mismos métodos públicos que cualquier objeto con interfaz Y tiene".

Por otro lado, una Clase Abstracta es como una clase parcialmente construida. Es muy parecido a un documento con espacios en blanco para rellenar. Podría estar usando inglés, pero eso no es tan importante como el hecho de que parte del documento ya está escrito.

Una clase abstracta es la base de otro objeto. Cuando una clase dice "Extiendo la clase abstracta Y" , está diciendo "Yo uso algunos métodos o propiedades ya definidas en esta otra clase llamada Y".

Por lo tanto, considere el siguiente PHP:

<?php
class X implements Y { } // this is saying that "X" agrees to speak language "Y" with your code.

class X extends Y { } // this is saying that "X" is going to complete the partial class "Y".
?>

Su clase implementaría una interfaz en particular si estuviera distribuyendo una clase para ser utilizada por otras personas. La interfaz es un acuerdo para tener un conjunto específico de métodos públicos para su clase.

Su clase extendería una clase abstracta si usted (o alguien más) escribió una clase que ya tenía algunos métodos escritos que quieres usar en tu nueva clase.

Estos conceptos, aunque fáciles de confundir, son específicamente diferentes y distintos. A todos los efectos, si eres el único usuario de cualquiera de tus clases, no necesitas implementar interfaces.

 1
Author: Vatsal Shah,
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
2018-05-23 09:19:35