1568 votes

Interface vs Classe Abstraite (général OO)

J'ai eu récemment deux entretiens téléphoniques où j'ai été interrogé sur les différences entre une Interface et une classe Abstraite. J'ai expliqué tous les aspects d'entre eux, je pense, mais il semble qu'ils sont en attente pour moi de parler de quelque chose de spécifique, et je ne sais pas ce que c'est.

De mon expérience, je pense que ce qui suit est vrai. Si il me manque un point important s'il vous plaît laissez-moi savoir.

Interface:

Chaque Méthode unique déclarées dans une Interface devra être mis en œuvre dans la sous-classe. Seuls les Événements, les Délégués, les Propriétés (C#) et les Méthodes peuvent exister dans une Interface. Une classe peut implémenter plusieurs Interfaces.

Classe Abstraite:

Seulement les méthodes Abstraites doivent être mises en œuvre par la sous-classe. Une classe Abstraite peut avoir des méthodes normales avec les implémentations. Classe abstraite peut aussi avoir des variables de classe à côté des Événements, des Délégués, des Propriétés et des Méthodes. Une classe peut implémenter une classe abstraite seulement en raison de la non-existence de Multi-héritage en C#.

  1. Après tout cela, l'enquêteur est venu avec la question "si vous aviez une classe Abstraite avec seulement des méthodes abstraites? Comment pourrait-il être différent d'une interface?" Je ne connaissais pas la réponse, mais je pense que c'est l'héritage comme mentionné ci-dessus à droite?

  2. Un autre enquêteur m'a demandé ce que si vous aviez une variable Publique à l'intérieur de l'interface, comment pourrait-il être différent de celui de la Classe Abstraite? J'ai insisté pour que vous ne pouvez pas avoir une variable publique à l'intérieur d'une interface. Je ne savais pas ce qu'il voulait entendre, mais il n'était pas satisfait.

Voir Aussi:

954voto

Jay Points 3483

Comment sur une analogie: quand j'étais dans l'armée de l'Air, je suis allé à la formation des pilotes et est devenu un pilote de l'USAF. À ce point, je n'étais pas qualifié pour voler quoi que ce soit, et a eu à assister type d'aéronef de la formation. Une fois que j'ai qualifié, j'ai été un pilote (classe Abstraite) et un C-141 pilote (de la classe de béton). Lors de l'une de mes missions, j'ai été donné un devoir supplémentaire: Agent de la Sécurité. Maintenant, j'étais encore un pilote et un C-141 pilote, mais j'ai aussi effectué Agent de la Sécurité des tâches (j'ai mis en place ISafetyOfficer, façon de parler). Un pilote n'est pas nécessaire d'être un agent de la sécurité, d'autres personnes pourraient avoir fait aussi bien.

Tous les pilotes de l'USAF doivent suivre certaines de la Force Aérienne à l'échelle de règlement, et tous les C-141 (ou F-16, ou un T-38), les pilotes", sont " les pilotes de l'USAF. N'importe qui peut être un agent de la sécurité. Donc, pour résumer:

  • Pilote: classe abstraite
  • C-141 Pilote: la classe de béton
  • ISafety: Agent d'interface

ajout d'une remarque: ce devait être une analogie pour expliquer le concept, pas un codage de la recommandation. Voir les différents commentaires ci-dessous, la discussion est intéressante.

816voto

Michael Burr Points 181287

Bien que votre question indique c'est pour le "général OO", il semble vraiment être en se concentrant sur .NET use de ces termes.

Dans .NET (similaire pour Java):

  • les interfaces peuvent avoir aucun état ou la mise en œuvre
  • une classe qui implémente une interface doit fournir une implémentation de toutes les méthodes de cette interface
  • les classes abstraites peuvent contenir d'état (données membres) et/ou la mise en œuvre (méthodes)
  • les classes abstraites peuvent être hérité sans mettre en œuvre les méthodes abstraites (un dérivé de la classe est abstraite elle-même)
  • les interfaces peuvent être multiples héréditaires, les classes abstraites ne peuvent pas (ce qui est probablement la clé raison concrète pour les interfaces d'exister séparément de abtract classes - ils permettent une implémentation de l'héritage multiple qui élimine la plupart des problèmes généraux MI).

Général OO termes, les différences ne sont pas forcément bien défini. Par exemple, il y a des programmeurs C++ qui peut détiennent les mêmes définitions rigides (les interfaces sont un sous-ensemble strict de classes abstraites qui ne peuvent pas contenir de mise en œuvre), alors que certains peuvent dire qu'une classe abstraite avec certaines implémentations par défaut est toujours d'une interface ou d'un non-classe abstraite peut encore définir une interface.

En effet, il y a un C++ idiome appelé le Non-Interface Virtuelle (INB) où les méthodes publiques sont non-virtuel méthodes 'thunk" pour virtuel privé méthodes:

249voto

Prasun Points 711

Je pense que la réponse qu'ils recherchent est le principe fondamental ou OPPS différence philosophique.

La classe abstraite de l'héritage est utilisé lorsque la dérivée de la classe d'actions à la base des propriétés et du comportement de la classe abstraite. Le genre de comportement qui définit en fait la classe.

D'autre part l'héritage de l'interface est utilisée lorsque les classes de partager des périphériques de comportement, ceux qui ne sont pas nécessairement définir la classe dérivée.

Pour eg. Une Voiture et un Camion partager beaucoup de cœur des propriétés et du comportement d'une Automobile classe abstraite, mais ils partagent aussi certains périphériques comportement comme de Générer des gaz d'échappement qui, même non automobile des classes comme les Foreurs ou PowerGenerators part et n'est pas nécessairement le définit d'une Voiture ou d'un Camion, de Voiture, de Camion, de Perçage et de PowerGenerator pouvons tous partager la même interface IExhaust.

240voto

Dhananjay Points 1047

Bref: les classes Abstraites sont utilisés pour la Modélisation d'une hiérarchie de classe de semblable à la recherche des classes (Par exemple, les Animaux peuvent être abstraites de la classe et de l'Homme , le Lion, le Tigre peut être en béton les classes dérivées)

ET

L'Interface est utilisé pour la Communication entre les 2 similaire / non similaires classes qui ne se soucie pas de type de la classe implémentant l'Interface(par exemple, la Hauteur peut être de l'interface de la propriété et il peut être mis en œuvre par l'Homme , de la Construction , de l'Arbre. Il n'a pas d'importance si vous pouvez manger , vous pouvez vous baigner, vous pouvez mourir ou quoi que ce soit.. il seulement une chose que vous devez avoir la Hauteur (mise en œuvre en vous classe) ).

81voto

Reed Copsey Points 315315

Il y a quelques autres différences -

Les Interfaces ne peuvent pas avoir une quelconque des implémentations concrètes. Les classes de base abstraites peuvent. Cela vous permet de fournir des implémentations concrètes. Cela peut permettre à une classe de base abstraite pour réellement apporter un plus rigoureuse contrat, wheras une interface vraiment que décrit comment une classe est utilisée. (La classe de base abstraite peut avoir des non-membres virtuels de définir le comportement, ce qui donne plus de contrôle à la classe de base de l'auteur.)

Plus d'une interface peut être implémentée sur une classe. Une classe ne peut dériver à partir d'une seule classe de base abstraite. Cela permet polymorphe de la hiérarchie en utilisant les interfaces, mais pas les classes de base abstraites. Cela permet également une pseudo-multi-héritage de l'utilisation d'interfaces.

Les classes de base abstraites peuvent être modifiés dans la v2+ sans casser l'API. Les changements d'interfaces sont des modifications importantes.

[C#/.NET Spécifiques] Interfaces, à la différence des classes de base abstraites, peut être appliquée à des types de valeur (les structures). Les structures ne peuvent pas hériter de classes de base abstraites. Cela permet de comportement des contrats/directives d'utilisation pour être appliquée sur les types de valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X