Je comprends qu'ils vous obligent à mettre en œuvre des méthodes et que telle, mais ce que je ne peux pas comprendre, c'est pourquoi vous voulez les utiliser. Quelqu'un peut-il me donner un bon exemple ou une explication sur pourquoi je veux le mettre en œuvre.
Réponses
Trop de publicités?Un exemple précis: les interfaces sont un bon moyen de spécifier un contrat que d'autres personnes le code doit répondre.
Si je suis en train d'écrire une bibliothèque de code, je peut écrire du code qui est valable pour les objets qui ont un certain ensemble de comportements. La meilleure solution est de spécifier les comportements dans une interface (pas de mise en œuvre, juste une description) et utiliser des références à des objets implémentant cette interface dans ma bibliothèque de code.
Alors à tout hasard personne peut venir, de créer une classe qui implémente cette interface, instancier un objet de cette classe et de le passer à ma bibliothèque de code et espérer qu'il fonctionne. Remarque: il est bien sûr possible d'appliquer strictement une interface tout en ignorant l'intention de l'interface, de sorte que seulement la mise en œuvre d'une interface n'est pas une garantie que les choses vont fonctionner. Stupide trouve toujours un moyen! :-)
Un autre exemple concret: deux équipes qui travaillent sur les différents composants qui doivent coopérer. Si les deux équipes s'asseoir sur le jour 1 et de s'entendre sur un ensemble d'interfaces, alors ils peuvent se séparer et de mettre en œuvre leurs composants autour de ces interfaces. L'équipe A peut construire harnais de test pour simuler la composante de l'Équipe B, pour les tests, et vice versa. Le développement en parallèle, et moins de bugs.
Le point clé est que les interfaces de fournir une couche d' abstraction , de sorte que vous pouvez écrire du code qui est ignorant de détails inutiles.
L'exemple canonique utilisé dans la plupart des manuels, c'est que des routines de tri. Vous pouvez trier une classe d'objets aussi longtemps que vous avez un moyen de comparer deux objets. Vous pouvez faire toute la classe triable par conséquent, par la mise en œuvre de l' IComparable
interface, qui vous oblige à mettre en œuvre une méthode de comparaison de deux instances. Toutes les routines de tri sont écrits pour gérer les références à des objets IComparable, donc dès que vous mettre en œuvre IComparable vous pouvez utiliser l'une de ces routines de tri sur des collections d'objets de la classe.
Les Interfaces de définir des contrats, et c'est le mot clé.
Vous utilisez une interface lorsque vous avez besoin de définir un contrat dans votre programme, mais vous n'avez pas vraiment sur les autres propriétés de la classe qui remplit ce contrat tant qu'il n'.
Donc, nous allons voir un exemple. Supposons que vous avez une méthode qui fournit les fonctionnalités de tri d'une liste. Première chose .. qu'est ce qu'une liste? Ne vous vous souciez vraiment de quels éléments est-il détient afin de trier la liste? Votre réponse devrait être non... Dans .NET (par exemple), vous disposez d'une interface IList qui définit les opérations que la liste DOIT prendre en charge si vous n'aimez pas les détails réels en dessous de la surface.
Pour revenir à l'exemple, vous ne savez pas vraiment la classe des objets dans la liste... ni vous soins. Si vous pouvez simplement comparer l'objet que vous pourriez aussi bien les trier. Vous déclarez donc d'un contrat:
interface IComparable
{
// Return -1 if this is less than CompareWith
// Return 0 if object are equal
// Return 1 if CompareWith is less than this
int Compare(object CompareWith);
}
ce contrat spécifier qu'une méthode qui accepte un objet et retourne un int doivent être mises en œuvre afin d'être comparables. Maintenant, vous avez défini un contrat et pour maintenant, vous ne se soucient pas de l'objet lui-même mais sur le contrat de sorte que vous pouvez faire:
IComparable comp1 = list.GetItem(i) as IComparable;
if (comp1.Compare(list.GetItem(i+1)) < 0)
swapItem(list,i, i+1)
PS: je sais que les exemples sont un peu naïfs, mais ils sont des exemples ...
La façon la plus simple de compréhension des interfaces est qu'ils permettent aux différents objets à exposer des fonctionnalités COMMUNES. Cela permet au programmeur d'écrire beaucoup plus simple, plus court code que les programmes d'une interface, puis aussi longtemps que les objets qui implémentent cette interface, il va fonctionner.
Exemple 1: Il ya beaucoup de différents fournisseurs de base de données, MySQL, MSSQL, Oracle, etc. Cependant, tous les objets de base de données peut FAIRE les mêmes choses et vous trouverez donc de nombreuses interfaces pour les objets de base de données. Si un objet implémente IDBConnection puis il expose les méthodes Open() et Close(). Donc, si je veux que mon programme de fournisseur de base de données agnostique, je programme à l'interface et non pas spécifiquement à des fournisseurs.
IDbConnection connection = GetDatabaseConnectionFromConfig()
connection.Open()
// do stuff
connection.Close()
Voir par programmation d'une interface (IDbconnection), je peux maintenant l'échange de tout fournisseur de données dans ma config mais mon code reste exactement la même. Cette flexibilité peut être très utile et facile à entretenir. L'inconvénient de cette est que je ne peux effectuer "générique" opérations de base de données et ne peuvent pas utiliser la force que chaque fournisseur propose donc, comme avec tout dans la programmation que vous avez un compromis et vous devez déterminer quel scénario vous profiteront le plus.
Exemple 2: Si vous remarquez, presque toutes les collections de mettre en œuvre cette interface IEnumerable. IEnumerable renvoie un IEnumerator qui a MoveNext(), Courant, et Reset(). Cela permet de C# pour déplacer facilement à travers votre collection. La raison qu'il peut faire, c'est car il expose l'interface IEnumerable elle SAIT que l'objet expose les méthodes qu'il a besoin d'aller à travers elle. Cela ne signifie deux choses. 1) les boucles foreach savez maintenant comment énumérer la collecte et 2) vous pouvez maintenant appliquer puissant LINQ exprssions à votre collection. Encore la raison pourquoi les interfaces sont très utiles ici, car toutes les collections ont quelque chose en COMMUN, ils peuvent être déplacés à travers. Chaque collection peut être déplacé par un autre moyen (liste liée vs tableau), mais c'est la beauté des interfaces, c'est que la mise en œuvre est caché et sans intérêt pour le consommateur de l'interface. MoveNext() vous donne l'élément suivant dans la collection, il n'a pas d'importance COMMENT il le fait. Assez sympa, hein?
Exemple 3: Lorsque vous concevez vos propres interfaces, vous avez juste à vous poser une question. Que faire de ces choses ont en commun? Une fois que vous trouver toutes les choses que les objets de partager, de vous résumé les propriétés/méthodes dans une interface de sorte que chaque objet peut hériter d'elle. Ensuite, vous pouvez programmer sur plusieurs objets à l'aide d'une seule interface.
Et bien sûr, j'ai donner mes préférés C++ polymorphes exemple, les animaux par exemple. Tous les animaux partagent certaines caractéristiques. Disons qu'ils peuvent Bouger, de Parler, et ils ont tous un Nom. Depuis que j'ai juste identifié ce que tous mes animaux ont en commun et j'possible de faire abstraction de ces qualités dans le IAnimal interface. Puis-je créer un Ours objet, une Chouette objet, et un Serpent objet de toutes les implémentant cette interface. La raison pour laquelle vous pouvez stocker différents objets qui implémentent la même interface est parce que les interfaces représentent un EST-UN replationship. Un ours EST UN animal, un hibou EST UN animal, donc il en fait depuis que je peux recueillir tous les Animaux.
var animals = new IAnimal[] = {new Bear(), new Owl(), new Snake()} // here I can collect different objects in a single collection because they inherit from the same interface
foreach (IAnimal animal in animals)
{
Console.WriteLine(animal.Name)
animal.Speak() // a bear growls, a owl hoots, and a snake hisses
animal.Move() // bear runs, owl flys, snake slithers
}
Vous pouvez voir que même si ces animaux pour effectuer chaque action d'une manière différente, je peux le programme contre tous dans un modèle unifié et ce est juste un des nombreux avantages des Interfaces.
Donc encore une fois la chose la plus importante, avec des interfaces est ce que les objets ont en commun de sorte que vous pouvez programmer à l'encontre de plusieurs objets de la MÊME façon. Permet de gagner du temps, crée plus d'applications flexibles, se cache la complexité de la mise en œuvre, les modèles du monde réel des objets et des situations, parmi de nombreux autres avantages.
Espérons que cette aide.