96 votes

Classe abstraite vs interface en Java

M'a posé une question, je voulais avoir ma réponse en revue ici.

Q: Dans quel scénario il est plus approprié d'étendre une classe abstraite plutôt que la mise en œuvre de l'interface(s)?

R: Si nous utilisons la méthode de modèle de modèle de conception.

Suis-je la corriger ?

Je suis désolé si je n'étais pas en mesure de l'état de la question clairement.
Je sais que la différence fondamentale entre l'abstrait classe et d'interface.
1) utiliser la classe abstraite lorsque l'exigence est telle que nous avons besoin pour mettre en œuvre les mêmes fonctionnalités dans chaque sous-classe pour une opération spécifique (implémentation de la méthode) et des fonctionnalités différentes pour certaines autres opérations (uniquement les signatures de méthode)
2) utilisation de l'interface si vous avez besoin de mettre la signature soit même (et la mise en œuvre différentes), de sorte que vous pouvez se conformer à l'implémentation de l'interface
3) nous pouvons étendre max d'une classe abstraite, mais peut implémenter plusieurs interfaces

réitérant la question: il y a un autre scénario en plus de ces cités ci-dessus où précisément nous avons besoin d'utiliser une classe abstraite (l'un est de voir est la méthode de modèle de modèle de conception est conceptuellement sur cette base seulement)

Modifier le Août 2013
Un point valide, j'ai eu comme réponse est
lien

Interface vs classe Abstraite

Le choix entre ces deux dépend vraiment de ce que vous voulez faire, mais heureusement pour nous, Erich Gamma peut nous aider un peu.

Comme toujours, il s'agit d'un compromis, une interface vous donne la liberté à l'égard de la classe de base, une classe abstraite vous donne la liberté d'ajouter de nouvelles méthodes tard. – Erich Gamma

Vous ne pouvez pas modifier une Interface sans avoir à changer de beaucoup d'autres choses dans votre code, de sorte que la seule façon d'éviter cela serait de créer une toute nouvelle Interface, qui pourrait ne pas toujours être une bonne chose.

Abstract classes devrait principalement être utilisé pour les objets qui sont closely related
Interfaces sont de mieux à offrir common functionality for unrelated classes.

91voto

DivineDesert Points 4932

Quand Utiliser Les Interfaces

Une interface permet à quelqu'un de commencer à partir de zéro pour mettre en œuvre votre interface ou de mettre en œuvre votre interface dans d'autres codes dont l'original ou le but principal était très différent de votre interface. Pour eux, votre interface est seulement accessoire, quelque chose à ajouter sur le code pour pouvoir utiliser votre forfait. L'inconvénient de chaque méthode dans l'interface doit être publique. Vous ne voulez pas vous exposer tout.

Lors de l'Utilisation De classes Abstraites

Une classe abstraite, en revanche, fournit plus de structure. Il définit généralement certaines implémentations par défaut et fournit des outils utiles pour une mise en œuvre complète. Le hic, c'est que le code à l'aide, elle doit faire usage de votre classe que la base. Qui peut être très gênant si les autres programmeurs qui souhaitent utiliser votre colis ont déjà développé leur propre hiérarchie de classe de façon indépendante. En Java, une classe ne peut hériter que d'une seule classe de base.

Quand Utiliser les Deux

Vous pouvez vous offrir le meilleur des deux mondes, une interface et une classe abstraite. Les réalisateurs peuvent ignorer votre classe abstraite s'ils le souhaitent. Le seul inconvénient de faire qui est de l'appel de méthodes par le biais de leur nom de l'interface est un peu plus lent que d'appeler par l'intermédiaire de leur classe abstraite nom.

Pour plus de détails, veuillez consulter ce lien

32voto

JVerstry Points 12414

réitérant la question: il y a un autre scénario en plus de ces mentionnés ci-dessus où précisément nous avons besoin d'utiliser une classe abstraite (l'un est de voir est la méthode de modèle de modèle de conception est conceptuellement basé sur cette seulement)

Oui, si vous utilisez JAXB. Il n'aime pas les interfaces. Vous devez utiliser les classes abstraites ou de contourner cette limitation avec les génériques.

À partir d'un blog post:

Interface

    A class can implement multiple interfaces
    An interface cannot provide any code at all
    An interface can only define public static final constants
    An interface cannot define instance variables
    Adding a new method has ripple effects on implementing classes (design maintenance)
    JAXB cannot deal with interfaces
    An interface cannot extends or implement an abstract class
    All interface methods are public

In general, interfaces should be used to define contracts
(what is to be achieved, not how to achieve it).

Abstract Class

    A class can extend at most one abstract class
    An abstract class can contain code
    An abstract class can define both static and instance constants (final)
    An abstract class can define instance variables
    Modification of existing abstract class code has ripple effects on extending classes (implementation maintenance)
    Adding a new method to an abstract class has no ripple effect on extending classes
    An abstract class can implement an interface
    Abstract classes can implement private and protected methods

Abstract classes should be used for (partial) implementation.
They can be a mean to restrain the way API contracts should be implemented.

18voto

SMK Points 1296

L'interface est utilisée lorsque vous avez un scénario selon lequel toutes les classes ont la même structure mais présentent des fonctionnalités totalement différentes.

La classe abstraite est utilisée lorsque vous avez un scénario selon lequel toutes les classes ont la même structure mais certaines fonctionnalités sont identiques.

Jetez un coup d'oeil à l'article: http://shoaibmk.blogspot.com/2011/09/abstract-class-is-class-which-cannot-be.html

3voto

EJP Points 113412

Vous n'êtes pas correct Il y a beaucoup de scénarios. Il n'est tout simplement pas possible de le réduire à une seule règle de 8 mots.

3voto

user2794921 Points 21

À mon avis , la différence fondamentale est qu' an interface can't contain non abstract methods while an abstract class can. Donc, si les sous-classes de partager un comportement commun, ce comportement peut être mis en œuvre dans la classe super et a ainsi hérité dans les sous-classes

Aussi, j'ai cité le passage suivant de "logiciel de conception de l'architecture ppatterns en java" livre

"Dans le langage de programmation Java il n'y a pas de support pour l'héritage multiple. Cela signifie qu'une classe ne peut hériter que d'une seule classe. D'où l'héritage doit être utilisé uniquement lorsque cela est absolument nécessaire. Chaque fois que possible, des méthodes la dénotation de la commune de comportement doit être déclarée sous la forme d'une interface Java pour être mis en œuvre par les différents organisateurs de classes. Mais les interfaces souffrent de la limitation qu'ils ne peuvent pas fournir des implémentations de méthode. Cela signifie que chaque responsable de l'implémentation d'une interface doit implémenter explicitement toutes les méthodes déclarées dans une interface, même si certains de ces méthodes représentent la partie invariable de la fonctionnalité et avoir exactement la même mise en œuvre dans l'ensemble de la responsable de l'implémentation de classes. Cela conduit à code redondant. L'exemple suivant montre comment le Résumé Parent de la Classe de modèle peut être utilisé dans de tels cas, sans exigeant redondant implémentations de méthode."

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