Question Quelle est la différence entre une interface et une classe abstraite?


Quelle est exactement la différence entre une interface et une classe abstraite?


1468
2017-12-16 08:15


origine


Réponses:


Interfaces

Une interface est un Contrat: La personne qui écrit l'interface dit, "hé, j'accepte les choses qui ont l'air de cette façon", et la personne qui utilise l'interface dit"OK, la classe que j'écris ressemble à ça".

Une interface est une coquille vide. Il n'y a que les signatures des méthodes, ce qui implique que les méthodes n'ont pas de corps. L'interface ne peut rien faire. C'est juste un motif.

Par exemple (pseudo code):

// 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;
    }
}

L'implémentation d'une interface consomme très peu de CPU, parce que ce n'est pas une classe, juste un tas de noms, et donc il n'y a pas de recherche coûteuse à faire. C'est génial quand c'est important, comme dans les appareils embarqués.


Cours abstraits

Les classes abstraites, contrairement aux interfaces, sont des classes. Ils sont plus chers à utiliser, car il y a une recherche à faire quand vous héritez d'eux.

Les classes abstraites ressemblent beaucoup aux interfaces, mais elles ont quelque chose de plus: Vous pouvez définir un comportement pour elles. Il s'agit plutôt d'une personne qui dit: «Ces cours devraient ressembler à cela, et ils ont cela en commun, alors remplissez les blancs!

Par exemple:

// 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");
    }
}

la mise en oeuvre

Alors que les classes abstraites et les interfaces sont supposées être des concepts différents, les implémentations rendent parfois cette affirmation fausse. Parfois, ils ne sont même pas ce que vous pensez qu'ils sont.

En Java, cette règle est fortement appliquée, tandis qu'en PHP, les interfaces sont des classes abstraites sans méthode déclarée.

En Python, les classes abstraites sont plus une astuce de programmation que vous pouvez obtenir du module ABC et qui utilise réellement des métaclasses, et donc des classes. Et les interfaces sont plus liées au typage du canard dans ce langage et c'est un mélange entre les conventions et les méthodes spéciales qui appellent des descripteurs (les méthodes __method__).

Comme d'habitude avec la programmation, il y a la théorie, la pratique et la pratique dans une autre langue :-)


1966
2017-12-16 08:37



Les principales différences techniques entre un classe abstraite Et un interface sont:

  • Les classes abstraites peuvent avoir constantes, membres, stubs de méthode (méthodes sans corps) et méthodes définies, alors que les interfaces ne peuvent avoir constantes et talons de méthodes.

  • Les méthodes et les membres d'une classe abstraite peuvent être définis avec toute visibilité, alors que toutes les méthodes d'une interface doivent être définies public (ils sont définis public par défaut).

  • Lors de l'héritage d'une classe abstraite, un béton classe enfant doit définir les méthodes abstraites, alors qu'une classe abstraite peut étendre une autre classe abstraite et les méthodes abstraites de la classe parente n'ont pas besoin d'être définies.

  • De même, une interface qui étend une autre interface est pas responsable de la mise en œuvre des méthodesà partir de l'interface parent. En effet, les interfaces ne peuvent définir aucune implémentation.

  • Une classe enfant peut seulement étendre une seule classe (abstrait ou concret), alors qu'une interface peut s'étendre ou une classe peut implémenter plusieurs autres interfaces.

  • Une classe enfant peut définir des méthodes abstraites avec visibilité identique ou moins restrictive, alors qu'une classe implémentant une interface doit définir les méthodes avec la même visibilité (publique).


749
2017-12-16 10:11



Une interface contient uniquement la définition / signature de la fonctionnalité, et si nous avons des fonctionnalités communes ainsi que des signatures communes, nous devons utiliser une classe abstraite. En utilisant une classe abstraite, nous pouvons fournir le comportement ainsi que la fonctionnalité à la fois. Un autre développeur héritant de la classe abstraite peut facilement utiliser cette fonctionnalité, car il lui suffit de remplir les blancs.

enter image description here

Pris à partir 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



Une explication peut être trouvée ici: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Une classe abstraite est une classe qui est   partiellement mis en œuvre par le   programmeur. Il peut contenir un ou plusieurs   méthodes abstraites. Une méthode abstraite   est simplement une définition de fonction   sert à dire au programmeur que le   la méthode doit être implémentée chez un enfant   classe.

Une interface est similaire à un résumé   classe; En effet, les interfaces occupent la   même espace de noms que les classes et résumé   Des classes. Pour cette raison, vous ne pouvez pas   définir une interface avec le même nom   en tant que classe. Une interface est entièrement   classe abstraite; aucune de ses méthodes   sont mis en œuvre et au lieu d'une classe   en sous-classant, on dit   implémenter cette interface.

Quoi qu'il en soit, je trouve cette explication des interfaces quelque peu confuse. Une définition plus commune est: Une interface définit un contrat que les classes d'implémentation doivent remplir. Une définition d'interface est constituée de signatures de membres publics, sans aucun code d'implémentation.


76
2017-12-16 08:18



Quelques différences importantes:

Sous la forme d'une table:

Difference

Comme déclaré par Joe de javapapers:

1. La différence principale est que les méthodes d'une interface Java sont implicitement abstraites et ne peuvent avoir d'implémentations. Une classe abstraite Java peut   avoir des méthodes d'instance qui implémente un comportement par défaut.

2.Les variables déclarées dans une interface Java sont par défaut finales. Une classe abstraite peut contenir des variables non finales.

3. Les membres d'une interface Java sont publics par défaut. Une classe abstraite Java peut avoir les saveurs habituelles des membres de classe comme privée,   protégé, etc.

Interface 4.Java devrait être mis en œuvre en utilisant le mot-clé "implémente"; Une classe abstraite Java doit être étendue en utilisant le mot clé "extends".

5.Une interface peut étendre une autre interface Java seulement, une classe abstraite peut étendre une autre classe Java et implémenter plusieurs Java   interfaces.

6.Une classe Java peut implémenter plusieurs interfaces mais elle ne peut étendre qu'une seule classe abstraite.

7. L'interface est absolument abstraite et ne peut pas être instanciée. Une classe abstraite Java ne peut pas non plus être instanciée, mais peut être invoquée si un   main () existe.

8.En comparaison avec les classes abstraites Java, les interfaces Java sont lentes car elles nécessitent une indirection supplémentaire.


36
2018-05-16 05:55



Je ne veux pas mettre en évidence les différences, qui ont déjà été dites dans de nombreuses réponses (concernant les modificateurs finals publics statiques pour les variables dans l'interface et le support des méthodes privées protégées dans les classes abstraites)

En termes simples, je voudrais dire:

interface: Pour implémenter un contrat avec plusieurs objets indépendants

classe abstraite: Pour implémenter le même comportement ou un comportement différent parmi plusieurs objets associés

De l'Oracle Documentation

Envisagez d'utiliser des classes abstrait si :

  1. Vous souhaitez partager du code entre plusieurs classes étroitement liées.
  2. Vous vous attendez à ce que les classes qui étendent votre classe abstraite aient de nombreuses méthodes ou champs communs, ou nécessitent des modificateurs d'accès autres que publics (tels que protected et private).
  3. Vous voulez déclarer des champs non statiques ou non finaux.

Envisagez d'utiliser des si :

  1. Vous vous attendez à ce que des classes indépendantes implémenter votre interface. Par exemple, de nombreux objets indépendants peuvent implémenter Serializable interface.
  2. Vous souhaitez spécifier le comportement d'un type de données particulier, mais ne vous inquiétez pas de savoir qui implémente son comportement.
  3. Vous voulez profiter de l'héritage multiple de type.

classe abstraite établit "est une" relation avec des classes concrètes. L'interface fournit une capacité "a" pour les classes.

Si vous cherchez Java en tant que langage de programmation, voici quelques autres mises à jour:

Java 8 a réduit l'écart entre interface et abstract classes dans une certaine mesure en fournissant un default caractéristique de la méthode. Une interface n'a pas d'implémentation pour une méthode n'est plus valide maintenant.

Reportez-vous à cette documentation page pour plus de détails.

Jetez un oeil à cette question SE pour les exemples de code pour mieux comprendre.

Comment aurais-je expliqué la différence entre une interface et une classe abstraite?


34
2017-11-27 12:42



Le point principal est que:

  • L'abstrait est orienté objet. Il offre les données de base qu'un «objet» devrait avoir et / ou des fonctions qu'il devrait être capable de faire. Il est concerné par les caractéristiques de base de l'objet: ce qu'il a et ce qu'il peut faire. Ainsi, les objets qui héritent de la même classe abstraite partagent les caractéristiques de base (généralisation).
  • L'interface est orientée fonctionnalité. Il définit les fonctionnalités qu'un objet devrait avoir. Quel que soit l'objet, tant qu'il peut faire ces fonctionnalités, qui sont définies dans l'interface, ça va. Il ignore tout le reste. Un objet / classe peut contenir plusieurs (groupes de) fonctionnalités; il est donc possible qu'une classe implémente plusieurs interfaces.

22
2017-09-29 09:54



Lorsque vous souhaitez fournir un comportement polymorphe dans une hiérarchie d'héritage, utilisez des classes abstraites.

Lorsque vous voulez un comportement polymorphique pour des classes complètement indépendantes, utilisez une interface.


20
2018-05-28 04:42



Je construis un bâtiment de 300 étages

Le plan du bâtiment interface

  • Par exemple, Servlet (I)

Bâtiment construit jusqu'à 200 étages - partiellement achevé ---abstrait

  • Implémentation partielle, par exemple, servlet générique et HTTP

Construction de bâtiments achevéebéton

  • Implémentation complète, par exemple, propre servlet

Interface

  • Nous ne savons rien de la mise en œuvre, seulement des exigences. nous pouvons aller pour une interface.
  • Chaque méthode est publique et abstraite par défaut
  • C'est une classe abstraite 100% pure
  • Si nous déclarons public, nous ne pouvons pas déclarer privé et protégé
  • Si nous déclarons abstrait, nous ne pouvons pas déclarer final, statique, synchronisé, strictfp et natif
  • Chaque interface est publique, statique et finale
  • La sérialisation et le transitoire ne sont pas applicables, car nous ne pouvons pas créer d'instance pour l'interface.
  • Non volatile car c'est final
  • Chaque variable est statique
  • Lorsque nous déclarons une variable dans une interface, nous devons initialiser les variables lors de la déclaration
  • Instance et bloc statique non autorisés

Abstrait

  • Mise en œuvre partielle
  • Il a une méthode abstraite. Un ajout, il utilise du béton
  • Aucune restriction pour les modificateurs de méthode de classe abstraite
  • Aucune restriction pour les modificateurs de variable de classe abstraite
  • Nous ne pouvons pas déclarer d'autres modificateurs excepté abstrait
  • Aucune restriction pour initialiser les variables

Tiré du site Web de DurgaJobs


20
2017-07-09 18:00