Valeur par défaut, type quelconque

ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 - 6 août 2007 à 15:13
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 8 août 2007 à 17:01
Eric

9 réponses

ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
6 août 2007 à 15:13
Visiblement, poster une question a la fin d'un topic noté comme résolu, c'est pas une bonne idée. Je resposte donc ma question. Je doit gérer l'appel a mon dictionnary, retournant la valeur si la KEY existe, et retournant une valeur par défaut si la KEY n'existe pas. Parcontre, je suis tout embrouillé avec l'interface, le static et le généric. Ce que jai tenté va comme suit, mais ne fonctionne pas (et ça je m'en doutais avant la compilation)

ICookingEntry<T>
=

public

interfaceICookingEntry<T>
{
static T DefaultEntry
{
get;
}
}
=

CookingDico<T,U> : Dictionnary<T,U>
=


publicclassCookingDico<TKey, TValue> : Dictionary<TKey, TValue>
where TValue : ICookingEntry<TValue>
{
publicnew TValue this[TKey value]
{
get
{
if ( ContainsKey( value ) )
returnbase[value];
else
return ( (ICookingEntry<TValue>)TValue ).DefaultEntry;
}
}
}

En effet, il me semblait bien que mettre un membre static a une interface était étrange ... et que la ligne
return ( (ICookingEntry<TValue>)TValue ).DefaultEntry;
Était d'autant plus étrange.

Comment devrais-je faire le tout ???

Eric
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
7 août 2007 à 10:05
si cest static, ca serait simplement TDictionnary<TValue>.DefaultEntry
Apres j'avoue qu'avec les generics au millieu, je suis pas sur a 100%
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
7 août 2007 à 10:11
en fait... il n'y a rien d'étrange...

il y a un membre static par type TValue... donc, il faut que tu retournes TDictionnary<TValue>.DefaultEntry à la place de ( (ICookingEntry<TValue>)TValue ).DefaultEntry. Car tu appelles un membre static via sa classe, pas par une instance !

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
7 août 2007 à 14:44
D'ou sort le TDictionnary ?

Vous me dites les deux la même chose, et j'ai beau relire et relire, je ne voit pas en quoi sa pourrait marcher, car je ne peut pas mettre un membre static dans une interface, j'ai une erreur a la compil.

Je ne comprends donc pas vraiment

Eric
0

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

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
7 août 2007 à 15:09
TDictionnary : une erreur de copier/coller...

sinon... en effet, j'ai mal vu le static dans l'interface... les membres statiques ne peuvent pas être surchargés.

à part ça, tu as une autre erreur (enfin, je pense)
public classCookingDico<TKey, TValue> : Dictionary<TKey, TValue>
            where TValue : ICookingEntry<TValue>

TValue ne peut pas hérité de ICookingEntry<TValue> : tu as une redondance cyclique.

pour terminer, tu peux obtenir la valeur par défaut d'un type en utilisant default(T)... mais par défaut tu obtiendras null

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
7 août 2007 à 18:58
Donc, je devrais me faire une classe defautValues static avec un truc style comme cela ?

public class DefaultValues
{
public static T GetDefault<T>()
{
switch( typeof(T) )
{
case typeof( Camion ):
new Camion("Camion Super Sonic", CamionType.Roues18);
break;
case typeof( Maison ):
new Maison("Maison parisienne", "Paris", MaisonType.Etages3);
break;
case typeof( Chien ):
new Chien("Fido", 4);
break;
}
}
}
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2007 à 09:19
il y a de l'idée...

public class DefaultValues
{
   public static T GetDefault<T>()
   {
      Object t;
      switch( typeof(T) )
      {
         case typeof( Camion ):
            t = new Camion("Camion Super Sonic", CamionType.Roues18);
            break;
         case typeof( Maison ):
             t = new Maison("Maison parisienne", "Paris", MaisonType.Etages3);
            break;
         case typeof( Chien ):
            t = new Chien("Fido", 4);
            break;
         default:
            t = default(T);
            break;
      }
      return (T)t;
   }
}

attention, ça risque d'être difficile à maintenir.

La question est pourquoi ne pas te tourner vers un pattern comme Factory ? http://www.dofactory.com/Patterns/PatternAbstract.aspx 

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
8 août 2007 à 16:57
Pour ce que tu m'a mis en gras, ça va de soi, j'avais écrit tout ça rapidement :)

Pour ce qui est des factory, la raison pourquoi je ne fait pas ça est que je ne connais pas ça. J'ai tenter quelquefois de lire le tout, mais chaque fois, je n'arrive pas a comprendre ce que ça apporte ou bien comment ça pourrait m'être utile (En fait c la même chose qu'avec la réflexion)
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2007 à 17:01
ça t'apporterait plus de flexibilité et te permettrait de réduire ton coût de maintenance...

ce pattern est très simple... il suffit de suivre l'exemple !

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
Rejoignez-nous