[C#] implicit operator & interface

tototat Messages postés 3 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 décembre 2007 - 12 déc. 2007 à 15:06
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 - 12 déc. 2007 à 20:13
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
A voir également:

5 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
12 déc. 2007 à 15:35
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
0
tototat Messages postés 3 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 décembre 2007
12 déc. 2007 à 16:00
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...
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
12 déc. 2007 à 16:18
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
0
tototat Messages postés 3 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 12 décembre 2007
12 déc. 2007 à 16:29
D'accord, je vais voir ce que je peux faire avec ces informations.

Merci pour ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
12 déc. 2007 à 20:13
Tiens nous au courant, c'est un sujet interessant.

::|The S@ib|::
MVP C#.NET
0
Rejoignez-nous