2011-01-16 3 views
0

Mon problème peut être simplifié en Liste <> avec les coordonnées X et Y que je voudrais regrouper dans une interface ou une classe abstraite. J'ai alors un tas d'autres fonctions qui prennent cette classe abstraite comme argument. La mise en garde à ceci est que l'élément X est soit d'un numérique ou est un DateTime. Voici quelques exemples de code pour illustrer ce que je suis en train de faire:C#: Interface avec Number ou DateTime

//C# 4.0 
abstract class Element : Group<DateTime, double> 
{ 
     public DateTime X {get; set;} 
     public double Y {get; set;} 
} 

public interface Group<T, U> 
{ 
     public T X {get; set;} 
     public U Y {get; set;} 
} 

void OtherObject.Do(List<Group<DateTime, double>> elm) 
{ 
    double[] X = 0; 

    for (int i = 0; i < elm.Count; i++) 
    { 
     if (elm[i].GetType() == typeof(DateTime)) 
     { 
      X[i] = ((DateTime)elm[i].X).TOADate(); 
     { 
     else 
     { 
      X[i] = elm.X; 
     } 
    } 

    //Other stuff 
} 

static Main() 
{ 
    List<Element> list = FactoryCreate(); 
    OtherObject obj = new OtherObject();  

    obj.Do(list); 
}  

Je voudrais être en mesure de préciser l'argument List<Group<DateTime, double>>-Do() sans préciser que les types génériques. J'aimerais juste pouvoir faire Do(List<Group> lst).

I il suffit d'éliminer les paramètres de type générique et d'utiliser le type de données dynamique dans le groupe, mais je ne pense pas que c'est la meilleure façon.

Existe-t-il un modèle établi pour résoudre ce problème? Je suis ouvert à 100% aux suggestions quant à la façon correcte de modéliser cette structure/classe de données.

+0

Vous devez spécifier les types dans Do(), car vous appelez X.TOADate(). Le compilateur doit savoir où trouver la méthode TOADate(), il doit donc savoir quel type est X. –

+0

Ajout d'un cast (15 caractères) – David

+0

Je ne comprends pas vos besoins. Pourquoi exactement voulez-vous vous débarrasser des arguments de type explicite dans 'D()' si cette méthode utilise activement les connaissances à leur sujet? –

Répondre

0

Je pense que vous l'avez compliqué. Votre DateTime et le double font tous deux la même chose = ils stockent la date et l'heure, alors allez-y et utilisez l'un d'entre eux et convertissez les valeurs de l'autre type si nécessaire. Ou créez votre propre classe DateTimeOrDouble et placez-la à la place du paramètre générique. Vous ne pouvez pas utiliser de paramètres génériques lorsque vous avez besoin de date ou double et devez appeler ToOADate(). En bref: N'utilisez aucun paramètre générique, car vous n'en avez pas besoin.

1

Vous pouvez créer une interface non générique IGroup avec les propriétés object et l'implémenter explicitement.

0

Encore un point: Vous mélangez ici l'interface publique et l'implémentation interne. Ceci est une mauvaise conception de logiciel. Votre interface doit simplement définir des opérations pour accéder à vos données, et ces opérations doivent être indépendantes de la représentation interne des données. Ensuite, vous devez définir certaines classes implémentant cette interface, à savoir une avec DateTime et l'autre avec double comme magasin de données réel. Rien de tout cela n'a besoin d'utiliser des génériques.