Pourquoi nous mettons en place des interfaces?

Pourquoi implémentons-nous, par exemple, ICLoneable ou IDisposable. Je ne demande pas ce que font ICloneable ou IDisposable, mais je veux savoir quelle est la bonne raison pour implémenter ces interfaces plutôt que d’écrire une méthode qui dispose ou clone nos objects?

L’utilisation d’interfaces assure la cohérence de l’utilisation de ces fonctionnalités. Ainsi, lorsqu’une autre classe souhaite / doit utiliser votre classe, elle peut agir en tant qu’object clonable et jetable sans se soucier des détails de votre implémentation.

En implémentant une interface bien connue, vous pouvez avoir un polymorphism, ce qui vous permet d’écrire un code générique pouvant agir sur n’importe quelle instance d’une classe implémentant une interface donnée.

Vous pouvez consulter l’article de Wikipedia sur le polymorphism pour en savoir plus.

Parce que vous souhaiterez peut-être que le même code fonctionne sur des instances de classes différentes. Par exemple, une routine de nettoyage de formulaire veut itérer sur tous les composants et les éliminer. Pour ce faire, il doit faire référence aux composants via un type: une classe de base commune ou une interface. Un inheritance unique signifie qu’une classe de base commune n’est pas toujours réalisable (supposons que ma forme comporte à la fois un FileStream et un Button – quelle classe de base commune pourrait-il avoir pour que la routine de nettoyage y accède?); d’où des interfaces.

Ajoutant à plus de sagesse d’interface, les interfaces peuvent être utilisées comme des contrats entre le code du consommateur et le code de service. Au lieu de dire que c’est l’object que nous allons traiter, avec les interfaces, l’accord est, voici à quoi ressemble l’object que je retourne. Dans le code, cela pourrait être quelque chose comme:

code de service

public IEnumerable GetNumbers(){ return new []{1,2,3,4,5}; } 

code client:

 var result = serviceProxy.GetNumbers(); 

Ici, le code de service peut changer d’implémentation pour renvoyer toute classe satisfaisant IEnumerable sans interrompre le code client.

En plus de tout cela, vous avez d’autres applications telles que IoC DI, Unit Testing, Object Mocking. Tous ces avantages de la bonté polymorphe.

Entre autres raisons, lisez à propos du bloc using .

Phoebus a donné une excellente réponse, mais pour en append un peu plus.

Cela vous oblige à écrire les méthodes attendues pour le clonage ou la création de quelque chose qui peut être éliminé. Si vous deviez écrire uniquement la méthode, incluriez-vous toujours toutes les méthodes nécessaires ou la signature serait-elle toujours la même?

S’il existe un nouveau cadre, et qu’ils ajoutent quelque chose, pour vous aider à vous assurer que les opérations sont effectuées correctement, en ayant des interfaces, cela vous oblige à implémenter de nouvelles modifications, car votre application ne comstackra plus.

En résumé, l’interface sépare l’implémentation et définit la structure. Ce concept est très utile dans les cas où l’implémentation doit être interchangeable. En dehors de cela, une interface est très utile lorsque l’implémentation change fréquemment.

L’interface peut être utilisée pour définir un modèle générique, puis une ou plusieurs classes abstraites pour définir des implémentations partielles de l’interface.

Les interfaces spécifient simplement la déclaration de la méthode (implicitement publique et abstraite) et peuvent contenir des propriétés (implicitement publiques et abstraites). La définition d’interface commence par le mot-clé interface. Une interface comme celle d’une classe abstraite ne peut pas être instanciée.

Une interface sépare ce qui est fait de la façon dont c’est fait. Les clients traitent le type d’interface sans avoir à connaître la classe d’implémentation, car ils peuvent compter sur le contrat appliqué.

Ceci est important pour les situations générant des proxies dynamics. Les clients n’ont pas besoin de savoir qu’ils ont affaire à un proxy, ce qui vous donne la liberté d’injecter le comportement dont vous avez besoin. C’est une technique courante pour la programmation orientée aspect.