[C#] implicit operator & interface

Signaler
Messages postés
3
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
12 décembre 2007
-
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
-
Bonjour,

Je développe une application manipulant un panier, des commandes et autres joyeusetés. J'ai mis en place un système de remises basé sur une interface IDiscount. J'ai, en gros, trois types de remise différents, héritant tous de l'interface IDiscount. Au moment de la création d'une commande, je dois copier plusieurs de ces remises, et je dispose alors d'une IDiscountCollection et j'aimerai faire la chose suivante : (le code ci-dessous n'est pas fonctionnel, c'est juste pour l'exemple...
foreach (IDiscount src in discountCollection)
{
       OrderDiscount dst = src;
       ....
}


Pour permettre cette assignation "brutale", j'ai essayé d'ajouter un operateur :
public static implicit operator OrderDiscount(IDiscount discount)
C'est là qu'est mon problème. J'ai une erreur de compilation plutôt obscure :
'OrderDiscount.implicit operator OrderDiscount(IDiscount)': user-defined conversion to/from interface
Cette erreur vient apparemment du fait qu'il s'agit d'une interface, et non d'une classe. En effet, si j'implemente le même operateur, mais avec un parametre different, en l'occurrence une autre class héritant de IDiscount, cela fonctionne :
public static implicit operator OrderDiscount(AccountDiscount discount)

La solution simple serait d'implementer l'opérateur pour toutes mes classes IDiscount, mais je préfèrerais trouver une méthode fonctionnant avec l'interface.

Est ce que quelqu'un aurait une idée ?

Merci de votre aide,

--
Nicolas

5 réponses

Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
Pour faire ceci :
public static implicit operator OrderDiscount(IDiscount discount)

Il faudrait que cette méthode soit définit dans ton interface, hors c'est par définition (de l'interface) impossible.

Comme tu as pu le voir, il faut absolument que le paramètre de l'opérateur soit du type de la classe.

Une solution serait te passer par une classe abstraite implémentant ton interface (ou pas, en conservant les abstracts sur ce que tu devrais implementer), et dans cette classe tu définis ton opérateur. Il n'y aurais plus qu'a utliser cette classe abstraite en lieu et place de ton interface.

::|The S@ib|::
MVP C#.NET
Messages postés
3
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
12 décembre 2007

Merci pour cette réponse.

L'idée de la classe abstraite est tout a fait pertinente, mais il se trouve que j'utilise EntitySpaces, et que mes classes héritent d'ores et déjà d'une entité. Je pourrais modifier les fichiers générés, mais le risque est qu'à la première regénération des fichiers, l'héritage de la classe abstraite sauterait...

Par contre, cela m'étonne quand tu dis que le paramètre doit être du type de la classe...

Par exemple, j'ai une classe Category, et j'ai dans cette classe l'opérateur suivant :

    public static implicit operator Category(string category)

Cet opérateur est bel et bien dans la classe Category et le paramètre est une string.
Donc je ne saisi toujours pas le problème...
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
S'il ne sont pas du même type tu aura une erreur de type : "user-defined conversion must convert to or from the enclosing type".


En fait les deux possibilités sont :


public static implicit operator Category (string category)
ou
public static implicit operator AnotherClass (Category category)

L'operation n'est pas la même mais dans les deux cas tu utilises le type conteneur.

::|The S@ib|::
MVP C#.NET
Messages postés
3
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
12 décembre 2007

D'accord, je vais voir ce que je peux faire avec ces informations.

Merci pour ton aide.
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
Tiens nous au courant, c'est un sujet interessant.

::|The S@ib|::
MVP C#.NET