En C#, si une classe possède toutes les bonnes méthodes/signatures pour une interface, mais ne les implémente pas explicitement comme suit:
class foo : IDoo {}
Est-ce que la classe peut toujours être castée en tant qu'interface?
En C#, si une classe possède toutes les bonnes méthodes/signatures pour une interface, mais ne les implémente pas explicitement comme suit:
class foo : IDoo {}
Est-ce que la classe peut toujours être castée en tant qu'interface?
Typage de canard
À quoi vous faites allusion est ce qu'on appelle le "typage de canard" (nommé d'après l'idiome "si cela ressemble à un canard, et ça coasse comme un canard, alors c'est un canard").
Avec le typage de canard, une implémentation d'interface est implicite une fois que vous avez implémenté les membres pertinents (comme vous le décrivez) cependant, .NET n'a actuellement aucun support général pour cela.
Avec les fonctionnalités des langages dynamiques émergents prévus pour l'avenir, je ne serais pas surpris si cela était pris en charge nativement par le runtime dans un proche avenir.
En attendant, vous pouvez synthétiser le typage de canard via la réflexion, avec une bibliothèque comme celle-ci, ce qui vous permettrait de faire une conversion typée de canard comme ceci : IDoo myDoo = DuckTyping.Cast(myFoo)
Quelques anecdotes
De manière intéressante, il y a un petit endroit où le typage de canard est utilisé en C# aujourd'hui - l'opérateur foreach
. Krzysztof Cwalina indique que pour être énuméré par l'opérateur foreach
, une classe doit :
Fournir une méthode publique GetEnumerator qui ne prend aucun paramètre et renvoie un type qui a deux membres : a) une méthode MoveNext qui ne prend aucun paramètre et retourne un booléen, et b) une propriété Current avec un getter qui retourne un objet.
Remarquez qu'il ne mentionne pas IEnumerable
ni IEnumerator
. Bien qu'il soit courant de mettre en œuvre ces interfaces lors de la création d'une classe énumérable, si vous deviez abandonner les interfaces mais laisser l'implémentation, votre classe serait toujours énumérable par foreach
. Voilà ! Typage de canard ! (Code d'exemple ici).
Cela nécessiterait essentiellement du Duck Typing pour fonctionner en C#, ce qui ne se produit pas automatiquement.
Il existe cependant certaines bibliothèques qui peuvent le faire.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.