2010-06-21 5 views
0

Possible en double:
Interface vs Base classQuand devrais-je choisir une interface et quand devrais-je utiliser une classe abstraite?

Je pensais juste quand quelqu'un devrait aller pour l'interface plutôt que d'une classe abstraite. Je sais que l'interface est utile pour l'héritage multiple mais en dehors de cela, quels autres avantages cela apporte-t-il par rapport à la classe abstraite?

+1

Voir [Interface vs classe de base] (http://stackoverflow.com/questions/56867/interface-vs-base-class) –

Répondre

0

Une classe peut implémenter plusieurs interfaces, mais ne peut hériter qu'une seule classe abstraite.

De plus il y a une différence sémantique. Hériter une classe indique une relation is-a, tout en implémentant une interface, vous obtenez une relation has-a. L'utilisation d'interfaces en combinaison avec la composition (appelée modèle strategy) permet une conception très flexible, qui peut être modifiée au moment de l'exécution.

+2

Eh, non. Implémenter une interface est aussi une relation 'is-a'. Une relation 'has-a' est lorsqu'une classe en encapsule une autre (c'est-à-dire qu'elle contient une instance de la classe en tant que champ ou propriété de membre). par exemple. Une voiture 'est-un' Véhicule 'public class Voiture: IVehicle', mais une voiture' has-a' volant 'SteeringWheel sh = car.SteeringWheel;'. –

+0

interface de l'outil: se comporte comme Y; étendre la classe: est-un Y; mais votre argument stratégie-pattern est bon comme je l'ai dit dans mon post. – atamanroman

2

Les interfaces définissent un contrat de comportement. Utilisez les classes abstraites lorsque vous souhaitez fournir une implémentation partagée ou un code commun, etc.

Les interfaces sont utilisées pour dire un type donné fournit une implémentation de sorte que le code qui attend l'interface sache comment le traiter. Il permet un comportement polymorphe dans la mesure où votre classe personnalisée implémente l'interface, mon API publique peut prendre votre classe comme interface et travailler avec elle.

résumés fournissent des implémentations de types dérivés, les interfaces demandent des mises en œuvre sur les types d'application.

1

Toujours préférer les interfaces aux classes abstraites. Si vous devez fournir une sorte d'implémentation, créez une classe abstraite qui implémente votre interface de base. Vous pouvez donc fournir une implémentation, tout en laissant le choix d'étendre votre classe abstraite ou d'implémenter l'interface.

classes abstraites vous obligent à les étendre afin de remplir le contrat. Puisque vous devriez préférer la composition à l'héritage, il est plus facile de créer votre propre classe avec une instance privée de votre classe x qui implémente l'interface y et implémente y avec votre wrapper, plutôt que d'étendre une classe abstraite. (Par exemple modèle Stratégie)

Jetez un oeil à Java efficace, point 18 pour plus d'informations.

Questions connexes