Précédent   Forum du club des développeurs et IT Pro > Dotnet > Langages > C#
C# Forum d'entraide sur la programmation C#. Avant de poster -> FAQ C#, Articles C#, Sources C#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/01/2013, 18h52   #1
grinder59
Membre habitué
 
Avatar de grinder59
 
Inscription : septembre 2005
Messages : 568
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 568
Points : 134
Points : 134
Par défaut décidement, j'ai du mal avec les interfaces

Hello,

je suis en train de me refaire une santé en C# (avec le bouquin C# version 2) et si j'ai compris que les interfaces étaient un contrat permettant de garantir qu'une classe dispose de certaines méthodes implémentées, je voudrais une petite explication sur l'exemple suivant :

1. Je crée une classe Personne
2. Pour pouvoir dupliquer une instance de Personne, je dois créer la méthode Clone dans laquelle j'utilise la méthode MemberWiseClone().

Dans l'exemple que donne le bouquin, il interface la classe Personne avec ICloneable. Ma question est la suivante :
Pour que la méthode Clone fonctionne, il n'y a pas besoin que la classe Personne soit ICloneable (j'ai testé :-). Donc, techniquement, à quoi sert le fait de déclarer Personne comme ICloneable ?

Merci de votre aide !
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h05   #2
zhouyu
Membre habitué
 
Avatar de zhouyu
 
Homme Loïc
Étudiant
Inscription : octobre 2009
Messages : 83
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 83
Points : 129
Points : 129
Salut.
Ca sert à ce que ta classe soit utilisable par d'autre méthodes qui accepte une interface IClonable.

Une interface permet de spécifier que telle ou telle classe à ses propriétés. Et si une méthode demande cette interface en paramètre, toutes les classes implémentant cette interface peuvent être donné à l'appel de la fonction.
zhouyu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 19h19   #3
grinder59
Membre habitué
 
Avatar de grinder59
 
Inscription : septembre 2005
Messages : 568
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 568
Points : 134
Points : 134
quand tu dis classes, c'est un raccourci pour "objets de la classe" ?
pourrais-tu me donner un exemple rapide ? Merci !
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h13   #4
GuruuMeditation
Expert Confirmé
 
Avatar de GuruuMeditation
 
Homme Olivier Matis
.Net Architect
Inscription : octobre 2010
Messages : 1 351
Détails du profil
Informations personnelles :
Nom : Homme Olivier Matis
Âge : 38
Localisation : Belgique

Informations professionnelles :
Activité : .Net Architect
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 1 351
Points : 2 867
Points : 2 867
Envoyer un message via MSN à GuruuMeditation
Pas de chance, IClonable est une interface un peu...ratée. Elle est d'ailleurs déconseillées par Microsoft (en gros car elle ne précise pas si c'est un clonage type "deep copy" or "shallow copy".

En gros, l’héritage d'une classe est une relation "est une". "Manager" est une "Personne". Il y a une notion de spécialisation

Une interface est une caractéristique, une fonctionnalité qui n'est pas relié spécialement à une classe. "IComparable", par exemple n'est pas une spécialisation d'une classe quelconque. IComparable peut être utilisée sur n'importe quelle classe. Si tu veux qu'une classe ait cette fonctionnalité, tu peux l'implémenter. Grâce à ça, tout le monde peut savoir que ta classe peut être comparée et peut donc être utilisée avec certains méthodes de tri, comme Array.Sort(), par exemple.

On voit là un autre avantage des interfaces : une sorte de généricité. La méthode Sort() de Array demande juste une interface IComparable. Elle ne se soucie pas de la classe elle-même. C'est donc très générique, n'importe qui peut l'utiliser en implémentant IComparable. Si Sort() demandait un type "Manager", par exemple, elle ne pourrait être utilisée que par des classes de type "Manager" ou dérivées.

Bon c'est peut-être pas super académique ce que je dis, mais c'est l'idée générale
__________________
Microsoft MVP : Visual C#

MCPD - Windows Phone Developer
MCPD - Windows Developer 4

http://www.guruumeditation.net

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
(Edsger W. Dijkstra)
GuruuMeditation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h19   #5
Babyneedle
Membre éclairé

 
Inscription : juin 2002
Messages : 283
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : juin 2002
Messages : 283
Points : 363
Points : 363
Les interfaces sont, entre autres, des contrats, c'est-à-dire une promesse d'implémentation.

Qu'il existe une interface ICloneable n'empêche aucune classe d'implémenter une méthode Clone().

C# offre le moyen de contraindre des instances à respecter un contrat donné et ça se fait par l'adhérence de la classe de cette instance à une interface.

Et ce même si cette contrainte ne garantit en rien la nature de l'implémentation du contrat.

Si une méthode exige un object qui adhère à IDisposable, rien ne garantie que l'implémentation de Dispose() ne sera pas un WriteLine("Hello!").

Par exemple, dans un module de bas niveau, j'exige qu'on passe une instance d'une classe qui implémente ICloneable à cause d'opérations parallèles asynchroniques. Je suis prêt à accepter que le clonage ne fonctionne pas (mon thread va m'indiquer que mon objet n'est pas valide) mais au moins, je n'aurai pas exception d'implémentation, ce qui serait assez gênant dans une librairie publique comme la nôtre.
Babyneedle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 21h25   #6
grinder59
Membre habitué
 
Avatar de grinder59
 
Inscription : septembre 2005
Messages : 568
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 568
Points : 134
Points : 134
Merci à tous, c'est plus clair en effet !
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h41.


 
 
 
 
Partenaires

Hébergement Web