Interface ou une Classe Abstraite: lequel utiliser?
Veuillez expliquer lorsque je devrais utiliser un PHP interface
et quand je dois utiliser un abstract class
?
Comment je peux changer mon abstract class
à un interface
?
Vous devez vous connecter pour publier un commentaire.
Utiliser une interface lorsque vous voulez forcer les développeurs à travailler dans votre système (vous inclus) pour mettre en œuvre un certain nombre de méthodes sur les classes qu'ils vont construire.
Utilisation d'une classe abstraite lorsque vous voulez forcer les développeurs à travailler dans votre système (vous inclus) pour mettre en œuvre un ensemble de numéros de méthodes et vous voulez fournir certaines méthodes de base qui leur permettront de développer leurs classes enfant.
Une autre chose à garder à l'esprit est client de classes ne peut étendre une classe abstraite, alors qu'elles peuvent implémenter plusieurs interfaces. Donc, si vous êtes de la définition de votre comportement contrats dans les classes abstraites, cela signifie que chaque enfant de la classe ne peut être conforme à un contrat unique. Parfois, c'est une bonne chose, quand vous voulez que vos utilisateurs-programmeurs, le long d'un chemin particulier. D'autres fois, il serait mauvais. Imaginez si PHP est Dénombrable et Itérateur interfaces ont été les classes abstraites au lieu d'interfaces.
Une approche commune lorsque vous ne savez pas où aller (comme mentionné par cletus ci-dessous) est de créer une interface, et ensuite votre classe abstraite à implémenter cette interface.
abstract
etinterface
classes, votre message fait tout clair. Merci beaucoup AlanLes différences entre un
Abstract Class
et unInterface
:Les Classes Abstraites
Une classe abstraite peut fournir certaines fonctionnalités et laisser le reste de la classe dérivée.
La classe dérivée peut ou ne peut pas remplacer le béton fonctions définies dans la classe de base.
Un enfant de la classe étendue à partir d'une classe abstraite doit logiquement être liés.
Interface
Une interface ne peut pas contenir toutes les fonctionnalités. Il seulement contient les définitions des méthodes.
La classe dérivée DEVEZ fournir le code pour toutes les méthodes définies dans l'interface.
Complètement différentes et non-classes associées peuvent être logiquement regroupés à l'aide d'une interface.
abstract class X implements Y
etclass X implements Y
?abstract class X implements Y
vous déclarez que la majeure partie des fonctionnalités de X doit être mis en œuvre dans une classe dérivée, et que l'abstrait et de la classe dérivée de doit contiennent des fonctions définies dans Y, alors queclass X implements Y
implique seulement que la classe X doit contenir les fonctions définies dans Y. Si votre interface Y est pas destiné à être mis en œuvre par toute autre classe de X je fait sauter la définition de Y comme une interface et d'implémenter les fonctions de Y public/protected/private fonction abstraite pour s'assurer qu'ils sont mis en œuvre dans le dérivant de la classe.Pourquoi utiliser les classes abstraites? Ce qui suit est un exemple simple. Disons que nous avons le code suivant:
Maintenant je vous donne une pomme et que vous en mangez.
Quel est son goût? Elle a le goût d'une pomme.
Ce n'est que le goût? Eh bien, il n'a pas beaucoup de sens, de sorte que vous ne devriez pas être en mesure de le faire. Ceci est accompli en faisant le Fruit de la classe abstraite ainsi que de la manger méthode à l'intérieur d'elle.
Une classe abstraite est juste comme une interface, mais vous pouvez définir des méthodes dans une classe abstraite, tandis que dans une interface elles sont abstraites. Les classes abstraites peuvent avoir à la fois vide et de travail/méthodes concrètes. Dans les interfaces, les fonctions qui y sont définies ne peut pas avoir un corps. Dans les classes abstraites, ils le peuvent.
Un exemple réel:
What does that taste like? Well, it doesn't make much sense, so you shouldn't be able to do that.
Maintenant je sais abstrait!final
mot-clé le faire? Excellent billet, merci.Meilleure pratique consiste à utiliser une interface pour spécifier le contrat et une classe abstraite comme une mise en œuvre de celle-ci. Cette classe abstraite peut remplir beaucoup de passe-partout de sorte que vous pouvez créer une mise en œuvre par juste primordial ce que vous devez ou voulez sans vous forcer à utiliser un particulier de la mise en œuvre.
Juste pour jeter ce dans le mélange, mais que Cletus mentionné à l'aide d'une interface en collaboration avec une classe abstraite, j'ai souvent utiliser l'interface pour préciser ma pensée du design.
Par exemple:
De cette façon, n'importe qui à la lecture de mon code (et qui sait ce qu'est un Décorateur Modèle est) va savoir tout de suite une) comment je construis mon analyseur et b) être en mesure de voir quelles sont les méthodes utilisées pour mettre en oeuvre le décorateur modèle.
Aussi, et je suis peut-être hors de la base, ici, n'étant pas un Java/C++/etc programmeur, mais des types de données peuvent entrer en jeu ici. Vos objets sont d'un type, et quand vous les transmettre, à travers le type de questions par programmation. Le déplacement de vos contractable des éléments dans l'interface uniquement dicte les types, les méthodes de retour, mais pas le type de base de la classe qui l'implémente.
Il est tard et je ne peux pas penser à une meilleure psudo-exemple de code, mais va ici:
La principale différence est une classe abstraite peut contenir défaut de mise en œuvre, tandis qu'une interface ne peut pas.
Une interface est un contrat de comportement sans mise en œuvre.
Aussi, tiens à ajouter ici que tout simplement parce que de tout autre langage OO a une sorte d'interfaces et d'abstraction trop ne signifie pas qu'ils ont le même sens et le but, comme en PHP. L'utilisation de l'abstraction/interfaces est légèrement différent, alors que les interfaces en PHP n'ont pas en réalité une fonction réelle. Ils ne sont utilisés pour la sémantique et le régime des raisons. Le point est d'avoir un projet bien souple que possible, évolutif et sûr pour les extensions futures, indépendamment de savoir si le développeur plus tard, a un tout autre plan de l'utilisation ou pas.
Si votre anglais n'est pas natif, vous risquez de recherche qu'Abstraction et les Interfaces sont en réalité. Et rechercher les synonymes de trop.
Et ce qui pourrait vous aider comme une métaphore:
INTERFACE
Disons, vous faites cuire un nouveau genre de gâteau avec des fraises et vous avez une recette décrivant les ingrédients et les étapes.
Seulement vous savez pourquoi c'est la dégustation si bien et vos invités comme il.
Ensuite, vous décidez de publier votre recette afin que d'autres personnes peuvent essayer le gâteau ainsi.
Le point ici est
C'est exactement CE que décrit interfaces. Il est un guide, un ensemble d'instructions qui observent le contenu de la recette.
Même que si vous créez un projet en PHP et vous souhaitez fournir le code sur GitHub ou avec vos potes ou quoi que ce soit.
Une interface est ce que les gens peuvent faire et ce que vous ne devriez pas. Les règles qui l' - si vous désobéissez à l'un, l'ensemble de la construction sera brisé.
ABSTRACTION
Pour poursuivre cette métaphore ici... imaginez, vous êtes l'invité de temps à manger le gâteau. Ensuite, vous essayez le gâteau à l'aide de la recette maintenant.
Mais vous voulez ajouter de nouveaux ingrédients ou modifier/sauter les étapes décrites dans la recette. Alors, quelle est la prochaine étape? Plan d'une autre version de ce gâteau.
Cette fois-ci avec des baies noires et pas de la paille de baies et de plus de crème à la vanille...miam.
C'est ce que vous pourriez envisager une extension de l'original gâteau. En gros, vous faites une abstraction, par la création d'une nouvelle recette parce que c'est un ptit différents. Il a un peu de nouvelles mesures et d'autres ingrédients. Cependant, le black berry version a certaines parties que vous avez pris au cours de l'original - ce sont les étapes de base que chaque type de gâteau doit avoir. Comme ingrédients comme le lait - c'est ce Que chaque classe dérivée de a de.
Maintenant, vous voulez échanger des ingrédients et les étapes qui DOIVENT être définis dans la nouvelle version de ce gâteau. Ce sont méthodes abstraites qui doivent être définies pour le nouveau gâteau, car il devrait être un fruit dans le gâteau, mais qui? Si on prend les baies noires cette fois. Fait.
Là vous allez, vous avez étendu le gâteau, suivie de l'interface et abstrait, les étapes et les ingrédients de lui.
À partir d'un phylosophic point de vue :
Une classe abstraite qui représente un "est" une relation. Disons que j'ai des fruits, eh bien, je voudrais avoir un Fruit classe abstraite qui partage des responsabilités et un comportement commun.
Une interface représente un "doit faire" de la relation. Une interface, à mon avis (ce qui est l'avis d'un dev junior), devrait être nommé par une action, ou quelque chose de proche d'une action, (Désolé, ne peut pas trouver le mot, je ne suis pas un anglais langue maternelle) permet de dire IEatable. Vous savez qu'il peut être mangé, mais vous ne savez pas ce que vous mangez.
À partir d'un point de vue du code :
Si vos objets de code dupliqué, c'est une indication qu'ils ont un comportement commun, ce qui signifie que vous pouvez avoir besoin d'une classe abstraite pour réutiliser le code, vous ne pouvez pas faire avec une interface.
Une autre différence est qu'un objet peut mettre en œuvre autant d'interfaces que vous avez besoin, mais vous ne pouvez avoir qu'une classe abstraite en raison de la "diamond problème" (voir ici pour savoir pourquoi! http://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem)
J'ai sans doute oublier certains points, mais j'espère que cela peut clarifier les choses.
PS : Le "est"/"doit faire", se traduit par Vivek Vermani réponse, je ne veux pas le priver de sa réponse, juste à réutiliser les termes parce que je les aimais!
À ajouter à certains déjà d'excellentes réponses:
Les classes abstraites laissez vous fournir un certain degré de mise en œuvre, les interfaces sont de purs modèles. Une interface ne peut définir fonctionnalité, il peut ne jamais le mettre en œuvre.
Toute classe qui implémente l'interface s'engage à mettre en œuvre toutes les méthodes qu'il définit ou il doit être déclarée abstraite.
Interfaces peuvent aider à gérer le fait que, comme Java, PHP ne supporte pas l'héritage multiple. Une classe PHP ne peut étendre un seul parent. Cependant, vous pouvez faire une classe promesse de mettre en œuvre autant d'interfaces que vous le souhaitez.
type: pour chaque interface, il met en œuvre, la classe a sur le type correspondant. Parce que toute classe peut implémenter une interface (ou plusieurs interfaces),
interfaces efficacement les types de jointure qui ne sont pas liés.
une classe peut à la fois d'étendre une super-classe et de mettre en œuvre un nombre quelconque d'interfaces:
Utiliser une interface lorsque vous avez besoin de fournir seulement un modèle sans mise en œuvre, afin que jamais, et vous voulez vous assurer que toute classe qui implémente cette interface aura les mêmes méthodes que toute autre classe qui l'implémente (au moins).
Utilisation d'une classe abstraite lorsque vous souhaitez créer une fondation pour les autres objets (une partie construite de la classe). La classe qui étend la classe abstraite allons utiliser quelques propriétés ou des méthodes définies et mises en œuvre:
Ici est un cas simplifié/exemple. Retirer tous les détails de mise en œuvre de sortir. Par exemple, changer votre classe abstraite à partir de:
à:
Les différences techniques entre une classe abstraite et une interface sont déjà inscrites dans les autres réponses avec précision. Je veux ajouter une explication à choisir entre une classe et une interface lors de l'écriture du code pour l'amour de la programmation orientée objet.
Une classe devrait représenter une entité alors qu'une interface doit représenter le comportement.
Prenons un exemple. Un écran d'ordinateur est une entité et doit être représenté en tant que classe.
Il est conçu pour fournir une interface d'affichage pour vous, de sorte que la fonctionnalité devrait être défini par une interface.
Il y a beaucoup d'autres choses à considérer, comme expliqué dans les autres réponses, mais c'est le plus simple que la plupart des gens ignorent tout de codage.
PHP
Voulais juste ajouter un exemple de quand vous pouvez avoir besoin d'utiliser les deux. Je suis en train d'écrire un gestionnaire de fichier lié à un modèle de base de données dans un ERP.
De cette façon, j'arrive à avoir plusieurs modèles pour différents fichiers et un ensemble de méthodes d'interface avec distinction claire. L'interface donne la bonne analogie pour les méthodes d'accès plutôt que de ce qu'aurait été avec une base de classe abstraite.
Plus bas sur la ligne quand je vais faire des adaptateurs pour les différents services de stockage de fichiers, cette mise en œuvre permettra à l'interface pour être utilisées ailleurs dans différents contextes.