Quand doit-on utiliser les interfaces?
Je sais qu'une interface n'a pas un corps juste une définition de la méthode. Mais quand dois-je utiliser les interfaces? Si je le donner à quelqu'un un ensemble d'interfaces avec pas de corps, pourquoi auraient-ils se sentir un besoin d'écrire le corps de la fonction? Serait-il mieux d'écrire leur propre classe abstraite avec des méthodes abstraites en elle.
Édité:
Je suppose que l'utilisation des Interfaces de plus, lorsque vous faites partie d'une équipe. Supposons que l'Équipe A écrit un code pour quelque chose et qu'ils voulaient voir si un appel à une méthode. avec nom getRecords(), qui est fait ou pas. Cela aidera l'Équipe B à écrire le corps de l'interface qui est fournie à eux, et l'Équipe B a garder le nom de la méthode similaire, de sorte que le code de l'Équipe A s'exécute.
Juste une pensée. J'ai peut-être tort. Je pense que les Interfaces n'ont pas l'usage pour un seul développeur.
Édité:
Merci à tous pour les réponses. Avec ce que vous avez tous répondu, je pense que les Interfaces ont plus utiliser lorsque vous effectuez quelque chose comme de l'API?
- Ce n'est pas nécessairement juste pour les équipes. Au lieu d'équipes, de le considérer en termes de consommateurs de votre API. Vous avez peut-être écrit de deux classes différentes. Vous avez peut-être l'architecture d'une solution qui fonctionne dans un modèle client-serveur. Vous pourriez être la création d'un service web qui doit être consommée. Quel que soit le cas, les interfaces sont à votre ami. Ils vous aideront à gérer la relation de l'appelant vs destinataire de l'appel.
- pas de "quand faut", mais toujours de faire des interfaces et la mise en œuvre séparément.
- Le travail en équipe n'est PAS la force motrice de l'interface d'utilisation. Les Interfaces sont TRÈS utiles pour un seul développeur.
- Théoriser vous avez une fourche hiérarchie de classe et vous avez besoin d'une fonctionnalité similaire dans les deux classes qui ne partagent pas l'ascendance, ou ne partage des ancêtres, mais ils sont un des moyens d'intervalle. Allons plus loin et dire que la fonctionnalité devrait être différent pour les deux classes de toute façon. Boom, l'utilisation de l'interface comme il sera mieux sur la performance, de la conception de code, et de maintenabilité. Ayant BESOIN d'interfaces est rare, la plupart des choses sont résout simplement avec
inheritance
+polymorphism
. - Les Interfaces sont grande, car il permet de s'assurer que vous avez tout ce dont vous avez besoin. Il ne vous permettra pas d'oublier quoi que ce soit. C'est comme si vous allez à l'école et vous avez une Interface avec vous, vous devez n'oubliez pas d'apporter votre ordinateur portable et quelle que soit l'école de l'équipement dont vous avez besoin avec vous.
Vous devez vous connecter pour publier un commentaire.
Dans des langages tels que Java et C# interfaces de fournir un moyen pour une classe d'être dans un polymorphe manière. C'est-à-dire une classe peut satisfaire plus d'un contrat, il peut se comporter comme plusieurs types différents, une classe d'un type peut être substitué à un autre. Dans d'autres langues, cela peut aussi être fourni par l'héritage multiple, mais il y a plusieurs inconvénients à cette approche. Cependant, une classe se comportent comme de plus d'un type n'est pas le plus commun de la motivation pour l'utilisation d'interfaces.
Par la programmation d'interfaces au lieu de classes, vous pouvez également dissocier votre programme à partir d'implémentations spécifiques. Cela le rend beaucoup plus facile de remplacer une classe de mise en œuvre pour l'autre. Ceci est particulièrement utile lors de l'écriture de tests unitaires où vous souhaitez échanger quelques poids lourds de la classe de mise en œuvre avec un léger l'objet fantaisie. Si votre programme ne prévoit qu'un type d'interface, et les deux poids lourds de l'objet et de l'objet fantaisie de mettre en œuvre ladite interface, alors qu'ils sont très faciles à remplacer.
Aussi, envisager un simple exemple Java où je dis avoir un programme qui affiche les pages de données sur l'écran. D'abord je veux pour obtenir les données à partir d'une base de données ou des fichiers XML. Si j'écris mon programme pour qu'il utilise les interfaces, je peux définir une interface comme ceci:
Et de l'utiliser comme ceci:
Je peux alors écrire une base de données et XML implémentations qui adhèrent à cette interface:
Parce que j'ai utilisé une interface je peux maintenant utiliser la mise en œuvre des bases de données XML, de façon interchangeable, sans avoir à changer les pièces de mon programme qui demandent les données de la page. Le XML et Base de données des implémentations probablement faire des choses complètement différentes, mais tous mes programme se soucie est que l'objet en fournissant les données de la page implémente l'
PageDatasource
interface.Interface de la Vie Réelle analogie:
Disons que vous souhaitez Émettre un Livre de la Bibliothèque.
Ce que vous allez faire:
1) Aller à la Bibliothèque
2) Trouver le Livre qui vous intéresse
3) Sélectionnez le Livre
4) Aller à la Bibliothécaire Bureau pour leur demander d'Émettre le Livre.
Maintenant ici Bibliothécaire est une Interface, ce qui signifie que vous ne sont pas intéressés dans l'enfer qui est Bibliothécaire, vous êtes uniquement intéressé par la personne assise sur le bureau de la Bibliothécaire(c'est la personne qui a conclu un contrat d'agir en tant que Bibliothécaire, ce qui signifie que la personne dont ont convenu de mettre en œuvre tous les comportements de Bibliothécaire)
Donc disons: Comportement de Bibliothécaire sont:
1) Question livre
2) Réédition Du Livre
3) Retour Livre.
la personne qui est désignée en tant que Bibliothécaire (qui signifie convenu d'adapter les trois ci-dessus comportements), doivent mettre en œuvre les comportements de sa propre manière.
Disons PersonA entend jouer un rôle de Bibliothécaire, puis il doit s'adapter au-dessus de 3 Comportements. Nous, en tant que Client ne se soucient pas comment il exécute son Bibliothécaire comportements, nous nous intéressons uniquement à cette personA est Bibliothécaire et de plus, il reste à effectuer le Bibliothécaire tâches.
Donc ce que vous allez faire, c'est la Référence par l'Interface[aller à la Bibliothécaire de Bureau(qui vous amène à des personnes agissant en tant que Bibliothécaire)] et disons que dans l'Avenir une personne a quitté le poste de Bibliothécaire, puis
en tant que client, il ne vous affectera pas si vous vous êtes approchés de la Bibliothécaire bureau, au lieu de spécifiques de la personne agissant en tant que Bibliothécaire.Donc le code de l'Interface au lieu de Concret est bénéfique.
Même comme un seul développeur d'interfaces peuvent être un outil très utile. Laissez-moi illustrer avec un exemple.
Supposons que vous êtes en train de développer un système permettant de gérer un catalogue de bibliothèque et de la bibliothèque va prêter à la fois des livres et des Dvd. Vous décidez de créer des classes Livre et Dvd aux éléments de modèle d'être prêté mais maintenant, vous voulez mettre en œuvre le polymorphisme de sorte que vous pouvez traiter avec des articles plutôt que des livres ou des Dvd. La question est doit Élément être une classe abstraite ou une Interface ?
Dans ce cas, vous voudrez probablement utiliser une classe abstraite car il existe des fonctionnalités communes aux deux Livre et Dvd que vous pouvez fournir par un parent de la classe, par exemple, de la vérification ou de retourner un article.
Maintenant, disons que vous souhaitez mettre en place un mécanisme de persistance pour votre catalogue de bibliothèque. Vous avez décidé que vous voulez stocker des données dans une base de données, certaines données dans des fichiers XML et des données dans les fichiers délimités par des virgules. Donc, la question maintenant est de savoir comment vous pouvez aller à ce sujet dans un polymorphe manière qui vous permet de traiter avec une persistance API ?
Dans ce cas, vous devriez probablement définir une Interface qui peut être mis en œuvre par chacune de vos classes fournissant la base de données, XML et délimité par des virgules persistance puisque chacun de ces mécanismes de persistance fournit des fonctionnalités similaires, c'est à dire le stockage et la récupération de données, mais chacun sera mis en œuvre de manière très différente. Cela va vous permettre de changer facilement de laquelle mécanisme de persistance que vous utilisez sans avoir à faire beaucoup de changements de code qui utilise le mécanisme de persistance.
Interfaces aider à clarifier la distinction entre les différentes unités fonctionnelles. Une unité dépend d'une autre unité de ne quelque chose, de ne pas être quelque chose. Tant que d'autres peuvent ne ce qui est stipulé dans l'interface (pensez contrat), alors il peut être quelque chose derrière les scènes.
Par exemple, j'ai une entrée du processeur qui lit les entrées à partir d'un seul endroit, et les écrit dans un autre endroit. Il ne se soucie pas de ce que/où, ou à quoi/où. Tous il se soucie est que c'est l'entrée d'un certain type de lecteur (à l'aide de la IReader interface) une fois sur le côté, et la remise à un certain type de l'écrivain (à l'aide de la IWriter interface).
Dans ma première mise en œuvre, le IReader opérateur obtient des choses à partir d'une base de données SQL, et le IWriter responsable de l'implémentation de messages par l'intermédiaire d'un client de service web. Cependant, nous allons à terme de créer d'autres exécutants sur l'une des extrémités pour accéder à d'autres référentiels (sites FTP, des répertoires de fichiers sur un réseau local en voiture, etc.).
Tout ce temps, le processeur dans le milieu ne se soucie pas et ne change pas. Il vient de pourparlers à travers ces interfaces standard.
En théorie, vous pouvez utiliser une classe de base (de préférence un résumé un) au lieu d'une interface, mais ça commence à verrouiller vos modules plus étroitement ensemble, ce qui rend votre système plus difficile à maintenir. Perdre de couplage n'est vraiment rendre votre vie plus facile, même si vous n'êtes pas sur une équipe de programmeurs. Considérer vous-même comme un autre programmeur, chaque fois que vous travaillez sur une partie différente de votre système. Chaque fois que vous revenez sur une section donnée, vous devez réapprendre ce qu'il fait pour l'entretenir. Si chaque pièce de votre système est étroitement couplée avec chaque autre pièce, alors vous devez avoir une constante, la connaissance intime de l'ensemble du système, et pas seulement l'une seule pièce sur laquelle vous travaillez.
Il y a aussi le concept d'une seule classe de la mise en œuvre de plusieurs interfaces, qui est presque comme l'héritage multiple. Dans cette situation, une seule classe peut effectuer plusieurs travaux (qui peut être soutenu n'est pas très sage, mais au moins c'est possible). Si vous avez choisi d'utiliser une classe de base au lieu d'une interface ci-dessus, alors ce ne serait pas possible.
Au premier coup d'oeil, les classes abstraites et les interfaces paraître comme une évidence. Pourquoi fournir une interface lorsque vous fournir une base de mise en œuvre? Après enquête, vous trouverez qu'il ya plus à cette.
Cela dit, il y a un certain nombre de raisons pour utiliser les interfaces. Vous pouvez trouver un bon billet de blog sur les différences ici.
Cela dit, considérez le fait que vous pouvez créer une interface (un "contrat" qui dit que votre classe a certainement prend en charge certains appels/signature de la méthode des invocations), mais vous ne pouvez fournir une seule classe abstraite. Aussi considérer le fait que vous pouvez créer une classe abstraite qui implémente une ou plusieurs interfaces, et héritent de ce. Ce n'est pas un bord de cas. C'est effectivement assez fréquemment dans l'API pour haute extensibilité.
Consultez le blog je vous ai cité et vous devriez obtenir une compréhension approfondie de l'utilisation de chaque et pourquoi vous devez les utiliser. Je voudrais également fortement recommander un bon livre tel que "CLR via C#" par Microsoft Press. Vous en apprendrez beaucoup!
La raison existe des interfaces est en raison de la 2 principe des concepts de la programmation orientée objet, qui est "l'identité" et de "fonctionnalité"
Les Classes ont des fonctionnalités et une identité. Avec l'héritage, les objets instanciés peut avoir beaucoup de fonctionnalités et des identités multiples.
Interfaces sont une identité sans la fonctionnalité. La fonctionnalité sera fourni par la classe instanciée.
La troisième forme, un "mixin" est une fonctionnalité sans identité. Les langages de programmation comme le rubis fournir cette troisième forme de l'héritage.
Comment vous utilisez une interface diffère selon le contexte de votre langage de programmation et de votre situation, mais rappelez-vous, les interfaces sont utilisées pour définir les identités qui sont appliquées sur des objets.
À ajouter à la réponse à la question précédente, les interfaces de vous aider lors de tests unitaires en vous permettant d'injecter un objet fantaisie basée sur une interface dans votre code, vous permettant de simuler des scénarios spécifiques et aussi d'isoler votre unité de test à un composant particulier sans s'appuyer sur des composants externes.
Par exemple, supposons que vous avez une logique d'entreprise de classe qui utilise les données de la logique de classe pour récupérer des données à partir d'une source de données et de les traiter ensuite. Par la création d'une interface pour les données de la logique de la classe dont elle hérite alors, vous pouvez créer une maquette/faux instance de cette classe en fonction de l'interface et de les injecter dans la classe de logique métier, vous êtes des tests unitaires. L'instance factices peuvent être définis de manière à obtenir une certaine méthode/propriété des appels, lancer des exceptions sur certains points, le retour valide sorties etc etc. Cela signifie, vos tests unitaires peuvent courir plus vite/potentiellement plus sûrement qu'ils ne comptent pas sur le sous-jacent de la source de données étant disponibles/n'ont pas besoin de s'y connecter. Et vous êtes isoler l'appareil de test de le réduire à une unité de code.
Une interface est mieux qu'une classe abstraite parce que vous pouvez implémenter plusieurs interfaces, et vous ne pouvez hériter d'une classe abstraite.
De sorte que vous pouvez faire:
Aussi, de recherche, de StackOverflow pour d'autres questions similaires comme Besoin d'interfaces en c#
Les Interfaces et les classes abstraites servent à des fins différentes.
Pour commencer, une classe abstraite est seulement bon pour l'héritage de - il ne peut pas être instanciée directement. Vous pouvez mettre de la mise en œuvre du code dans une classe abstraite, mais ce code ne peut être appelé à partir de la classe qui étend la classe, ou par l'intermédiaire de la classe qui étend la classe elle.
exemple:
Le but de l'interface est de fournir un contrat - ce qui signifie que la classe qui l'implémente a à fournir mise en œuvre pour les propriétés ou fonctions déclarées dans l'interface, et c'est exactement la même fonction de signatures. Ceci fournit la caution, quand j'écris un code qui appelle une classe qui implémente une interface, et il n'est pas pertinent ce que les classes sont dérivées à partir de, ou même la langue qu'ils sont écrites, ou où je les ai fait partir. Une autre fonctionnalité intéressante est que je peux avoir plusieurs implémentations différentes de la même fonction de signature pour les différentes interfaces. Cochez cette exemple, qui utilise certains des mêmes classes de l'exemple précédent:
C'est un problème de conception (je parle de monde java).
L'interface vous permettent de définir le comportement et la structure du composant (classe) de votre logiciel sans vous donner de contrainte au moment de l'exécution.
La classe abstraite, au lieu de cela, vous donne un comportement par défaut pour une méthode: très utile si vous êtes sûr que ce code pourrait ne pas changer dans la lyfe-moment de la demande.
Exemple:
Vous avez une application web du système commercial envoyer un email dans certaines situation (signe d'un nouvel utilisateur).
Vous pouvez utiliser la classe abstraite SenderCommunication avec la méthode boolean sendWithSuccefull(...) si vous êtes sûr que le comportement ne changera souvent.
Vous pouvez utiliser l'interface InterfaceSenderCommunication avec la méthode boolean sendWithSuccefull(...) si vous n'êtes pas sûr que le comportement ne changera souvent.
Bien sûr, le jugement de "changer souvent pas souvent" dépend de 2 éléments:
l'ancien code avec les nouvelles spécifications?
Supposons que j'ai la classe FoodEstablishment, maintenant je veux faire simple opération CRUD, alors comment dois-je faire?
Je définir une interface pour le service, mais pourquoi?
Ensuite je vais mettre en œuvre ce contrat ou de l'interface pour ce service en particulier
Donc dans mon programme principal ou lorsque je souhaite utiliser le Service, je vais faire
Jusqu'à maintenant, il semble comme une étape supplémentaire, nous pourrions directement fait
Mais attendez quoi si je pourrais avoir besoin pour passer mon insérer de la logique par le biais de la file d'attente plutôt que directement à un serveur, d'attente pour l'opération d'insertion de remplir et de retourner ensuite conséquent, plutôt passer sur la file d'attente, puis la file d'attente travailleur manipule ceux de l'opération, peut-être pas la meilleure idée de la file d'attente de plaquette, mais oui certainement bon pour l'interface exemple :-). Alors maintenant, ce que je fais est, de créer une autre classe FoodEstablishment l'exécution du contrat IFoodEstablishment.
Alors maintenant, si je veux utiliser la file d'attente de la version, je voudrais juste faire
On pourrait le faire avec l'ancienne façon à l'aide de la classe, mais que les limites de l'instanciation de classe avec une classe particulière qui est un peu rigide de la vulgarisation, maintenant FoodEstablishmentQueueService pouvez faire d'autres choses aussi, créer une autre méthode jusqu'à ce que le contrat est valide si l'interface est en contact pour des raisons de cohérence, l'Imagerie, un gars qui fait de la version normale et l'autre en faisant la file d'attente de la version ou de quelqu'un qui fait cache version, il y a peut-être des problèmes concernant la signature, à moins que son pré-spécifié sur le contrat de travail et que les gens ne finissent pas à la contre-vérification de tout.
De même, envisager d'autres exemple simple d'utilisation de types prédéfinis comme IEnumerable. Supposons que je passe une liste de FoodEstablishment de collecte et de retourner sur liste triée
Nous allons donc l'utiliser de cette façon
Mais que faire si nous envoyer la liste au lieu de la matrice de
Nous allons obtenir une erreur, parce que la rigueur de sa mise en œuvre à l'aide de la classe au lieu de cela, nous utilisons IEnumerable<> qui est mis en œuvre par Liste et que, fondamentalement, supprime la dépendance de la Liste de l'Interface
Donc généralement mise en œuvre extrêmement dépend de la situation
L'une des raisons pour utiliser les interfaces, c'est quand une classe mettra en œuvre un certain nombre d'interfaces. Une classe abstraite ne peut pas le faire.
Est un exemple d'une classe qui gère les mouvements de la souris et des touches mettra en œuvre à la fois (le ficticious) IMouseMove et IKeyPress interfaces.
Aussi, l'utilisation d'interfaces facilite les tests unitaires. Afin de tester les classes qui dépendent des interfaces, et aussi longtemps que vous êtes à l'aide de l'injection de dépendance, vous pouvez créer stub des classes qui implémentent l'dépendait des interfaces, ou vous pouvez utiliser un moqueur moteur.
Java lang ne supporte pas l'héritage multiple, depuis les interfaces sont utilisées pour atteindre l'objectif.
Pour une classe abstraite seulement 1 méthode est abstraite, alors que dans le cas de
l'interface de toutes les méthodes sont abstraites .
Classe abstraite v/s de l'interface est toujours un point de discussion entre développeurs. Je voudrais ajouter mon 5 cents.
Utilisation de la classe abstraite lorsque vous souhaitez étendre un comman de base et où vous voulez fournir une implémentation par défaut de la méthode abstraite.
Utilisation de l'interface quand vous voulez exactement de mettre en œuvre toutes les méthodes abstraites de la classe implementaing l'interface et pas de défaut corps d'une méthode peuvent être fournis.
Il est de bon style pour stocker une référence à un HashSet ou TreeSet dans une variable de type Ensemble.
Set<String> names = new HashSet<String>();
De cette façon, vous avez à changer une seule ligne si vous décidez d'utiliser un
TreeSet
à la place.Aussi, les méthodes qui fonctionnent sur des ensembles devraient spécifier les paramètres de type de Jeu:
public static void print(Set<String> s)
Ensuite, la méthode peut être utilisée pour définir tous les implémentations.
En théorie, nous devrions faire la même recommandation pour les listes liées, à savoir sauver des
LinkedList références dans des variables de type Liste. Cependant, dans la bibliothèque Java, la Liste de l'interface est commune à la fois à l'
ArrayList
et laLinkedList
classe. En particulier, il a des méthodes get et set pour un accès aléatoire, même si ces méthodes sont très inefficace pour les listes chaînées.Vous ne pouvez pas écrire du code efficace si vous ne savez pas si d'accès aléatoire est efficace ou pas.
Ce n'est manifestement une grave erreur de conception dans la bibliothèque standard, et je ne peux pas recommander l'utilisation d'
la Liste de l'interface pour cette raison.
(Pour voir juste comment embarrassant que l'erreur est, jetez un oeil à
le code source de la méthode binarySearch des Collections de la classe. Cette méthode prend un
Paramètre de liste, mais la recherche binaire n'a pas de sens pour une liste liée. Le code puis maladroitement
essaie de découvrir si la liste est une liste chaînée, et passe ensuite à une recherche linéaire!)
La
Set
de l'interface et laMap
de l'interface, sont bien conçus, et vous devez les utiliser.Interface conserve la définition et la mise en œuvre Séparée.Ainsi, dans le cas où si vous voulez Fournisseur de mise en Œuvre spécifiques, alors que c'est la meilleure façon de le faire .
L'exemple de la vie réelle c'est JDBC Si vous voyez l'API Statemnet ,PreparedStatemnet Tout ce qui est de l'interface, mais la mise en œuvre est spécifique au vendeur comme Oracle ojdbc pot a une autre mise en œuvre ,mysql eu quelques autres.
Dans le cas où vous souhaitez modifier la Base de données, vous avez juste à chnage le pilote de nad dans le cadre nom de la classe. C'est l'avantage de l'utilisation de l'interface
Utilise de l'interface:
Strategy_pattern
Si vous êtes à la recherche pour java comme langage de programmation,
interface
a quelques plus de fonctionnalités avec l'ajout de ladefault
etstatic
méthodes depuis Java-version 8.Reportez-vous à cette question pour plus de détails:
Pourquoi utiliser des Interfaces, Héritage Multiple vs Interfaces, les Avantages des Interfaces?
Objets qui appartiennent à une catégorie peuvent utiliser une Interface.Quand EST-il existe UNE relation entre les objets.
E. g. Texte,Image,MP3,FLV,MOV appartient FileType catégorie
Si notre application permet aux utilisateurs de télécharger des 4 types de fichiers qu'ils appartiennent tous à une seule catégorie appelée TYPE de FICHIER
Dans le code, nous aurions objet pour chacun des types ci-dessus.
Supposons que nous avons besoin d'envoyer un fichier puis
Avec Interface de Sortie
Avec Interface
Donc on peut supposer que tous les types de fichiers(Texte,Audio, etc) pour être de type FileFormat.Donc nous former une relation " EST-UN.
Cela permet lors d'un retour de type de données unique au lieu de renvoyer type spécifique à partir d'une fonction, nous pouvons envoyer des type le plus commun qui est FileFormat.