tototat
Messages postés3Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention12 décembre 2007
-
12 déc. 2007 à 15:06
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 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.
TheSaib
Messages postés2367Date d'inscriptionmardi 17 avril 2001StatutMembreDernière intervention26 décembre 200723 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.
tototat
Messages postés3Date d'inscriptionlundi 6 novembre 2000StatutMembreDernière intervention12 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...