2010-01-19 4 views
13

Quelqu'un peut-il me dire quelle est exactement la différence entre une classe complètement abstraite et une interface?pure classe abstraite et interface

Une classe abstraite peut également avoir toutes ses méthodes abstraites. Une interface a toutes ses méthodes comme abstrait. Quelle est la principale différence entre les deux dans ce scénario?

S'il existe une différence entre une classe abstraite pure et une interface? Quelle est l'utilisation de l'interface? Où l'interface est utilisée, nous pouvons utiliser la classe abstraite pure?

Répondre

14

Pour compléter les réponses précédentes:

Une interface est un "contrat". Si une classe implémente une interface, elle doit proposer tous les services listés dans l'interface.

Une classe abstraite est un squelette. Il définit d'une certaine manière ses classes étendues fonctionnera tout en leur laissant de l'espace libre (les méthodes abstraites) pour être unique.

Une classe abstraite pur faire la même chose que d'une interface, mais ont le problème de unique, étendant ainsi, pour moi, il a aucun intérêt

+1

Une classe abstraite pure a le problème de l'extension unique mais peut définir d'autres accessibilités que le public. – csblo

2

Une classe abstraite peut fournir une implémentation, c'est-à-dire une méthode (publique, protégée, privée) des corps. Une interface peut simplement déclarer des signatures de méthode publique. Ces méthodes doivent être réalisées (sous la forme de corps de méthode) par des classes implémentant l'interface.

5

en Java et C#, on peut utiliser plusieurs interfaces pour dériver et une seule classe d'hériter de,

+1

c'est la réponse –

+1

Ce n'est pas LA réponse car un aspect très important n'est pas mentionné: les classes abstraites * peuvent * avoir des membres implémentés. –

+1

@Wim: true, mais si vous lisez le deuxième paragraphe de la question d'origine, il est clair que l'OP s'intéresse uniquement aux classes abstraites qui n'ont pas de méthodes implémentées et ressemblent donc presque à des interfaces. – catwalk

10

Chaque interface est implicitement abstraite: Toute déclaration de méthode dans le corps de l'interface est implicitement abstraite et publique.

Une classe abstraite possède des méthodes pouvant contenir une implémentation. Les méthodes abstraites peuvent être publiques, protégées ou par défaut (package visible). Contrairement aux interfaces, les classes abstraites peuvent contenir des champs qui ne sont pas statiques et définitifs.

Voir aussi:
Interfaces vs Abstract classes et Java tutorial

0

Une classe peut implémenter plusieurs interfaces, mais seulement prolonger d'une classe (abstraite ou autre). Si vous devez spécifier une interface, vous devez utiliser une interface, afin que les classes puissent implémenter plusieurs de vos interfaces.

2

Il existe trois différences:

  1. Interfaces ne peut déclarer les méthodes publiques (pas de méthodes visibles protégées ou de l'emballage-privé) et ne peuvent pas déclarer tous les champs
  2. Sous-classes ne peut étendre au plus une classe abstraite , mais il peut mettre en œuvre un certain nombre d'interfaces
  3. La classe abstraite peut également mises en œuvre pour une partie ou l'ensemble des méthodes
+0

Et une classe abstraite * peut * avoir implémenté des méthodes. –

1

Vous pouvez utiliser l'interface pour l'héritage multiple, mais vous ne pouvez pas utiliser la classe abstraite pour l'héritage multiple.

Toutes les méthodes d'Interface sont publiques par défaut, en classe abstraite, seules les méthodes que vous avez définies en tant que résumé doivent être déclarées publiques.

1

Je vais juste aborder un point (principalement parce que les autres questions ont été adressées déjà):

"Lorsque l'interface est utilisée, nous pouvons utiliser pour utiliser la classe abstraite pure?"

En théorie, vous pourriez. Cependant, vous perdrez la flexibilité et le couplage lâche dans une certaine mesure. Il est beaucoup plus préférable de coder les interfaces et de les transmettre, en particulier dans les scénarios d'inversion de contrôle (IoC) et d'un point de vue de l'intégration, car cela permet une extensibilité beaucoup plus grande.

2

Depuis la question est sur pur classes abstraites alors je dirais que la réponse va être liée à l'héritage et la portée. C'est quelque chose que je me suis demandé plusieurs fois et c'est ce que j'ai trouvé.

De toute évidence, les fonctionnalités liées à l'héritage multiple ont déjà été répondues, donc je ne vais pas entrer dans tout cela. La portée est grande.

Dans un car ils sont implicitement du public vous ne pouvez pas définir les modificateurs d'accès de membre Interface , ... vous définissez l'interface publique pour sa mise en œuvre éventuelle. Il y a une différence importante puisque peut définir un membre abstrait protégé dans une classe abstraite pure.

Héritant d'une telle définition de la classe forcerait l'héritier à mettre en œuvre le membre abstrait, mais la portée en privé aux consommateurs de la classe (bien qu'il devrait être défini comme protected donc à moins que la classe a été marquée comme sealed héritières d'autres auraient accès).

En substance, vous pouvez définir une interface privée en utilisant des classes abstraites pures. Que ce soit une bonne idée ou non, c'est une toute autre question, mais une bonne utilisation que je l'ai vue utilisée est d'appliquer des modèles de conception et de standardiser les conceptions de classe.

HTH

+2

Il n'y a pas de mot clé 'sealed' dans Java; la sous-classe devrait être marquée comme «finale». –

3

Il est pas très explaination theorotical mais il est tout programatically correct

        Interface     Abstract Class 
Extend Class       No       Yes 
Extend Abstract Class     No       Yes 
Implement Interface      Yes(Extend Interface)  Yes 
Variables        Public Static Final   Public/Protected/Private/static/final/transient/volatile 
Contain Non-Public Method    No       Public/Protected/*Private 
Contain Abstract Method     Yes       Yes 
Contain No-Body, Non-Abstract Method Yes       No 
Contain Defined Method     No       Yes 
Contain Main Method      No       Yes 

* Les classes abstraites peuvent avoir des méthodes privées, mais pas des méthodes privées abstraites.

3

L'une des raisons de choisir une interface abstraite pure consiste à forcer des sous-classes à implémenter des méthodes particulières implémentées par une super classe.

Par exemple (en Java),

que vous voulez toutes les classes étendant à mettre en œuvre toString(), est égal à() et hashCode().

Vous pouvez créer une interface appelée ForceSomeMethods pour ce contrat, mais ces méthodes sont implémentées implicitement par Object.

En faisant de ForceSomeMethods une classe abstraite pure avec toString(), etc. comme méthodes abstraites, toutes les sous-classes seront forcées à implémenter ces méthodes.

+0

Ceci est une réponse vraiment intéressante, et que je n'avais pas vu ailleurs. Pas toute la réponse, mais un détail très précieux. –

Questions connexes