2010-05-12 4 views
0

J'essaie de créer une classe générique qui prend 3 types, soit une simple chaîne, IList<string> ou IList<OntologyStore>.Comment créer une classe générique qui prend 3 types

public class OntologyStore 
{ 
} 

public sealed class jim<T> where T:new() 
{ 
    string J; 
    IList<string> X = null; 
    IList<OntologyStore> X1 = null; 

    public jim() 
    { 
     if (typeof(T) == typeof(String)) 
     { 
      J = string.Empty; 
     } 
     if (typeof(T) == typeof(OntologyStore)) 
     { 
      X1 = new List<OntologyStore>(); 
     } 
     if (typeof(T)==typeof(IList)) 
     { 
      X = new List<string>(); 
     } 
    } 
} 

Je peux facilement créer, ce que vous attendez de travailler,

jim<OntologyStore> x1=new jim<jim<OntologyStore>() 

que vous attendez, mais quand je mets en

jim<string> x2=new jim<string>() 

le compilateur rapporte la chaîne est non type abtract, auquel vous vous attendriez.

Est-il possible de créer une classe générique, qui peut être instanciée comme une classe qui contient une chaîne, ou un IList<string> ou un IList<OntologyStore>?

+0

Vous avez vraiment réussi à me dérouter! Quel problème essayez-vous de résoudre? – flq

+0

Il serait plus facile de répondre à votre question si vous donniez à vos classes quelque chose d'autre que des noms propres. Il devient confus en se référant aux classes nommées 'jim' ou' bob'. – LBushkin

+0

Ignorer mon message, vous avez mis à jour la question pendant que j'écrivais ma réponse. Je ne suis pas sûr de comprendre ce que vous essayez de faire avec cette classe. Je suis un peu confus quant à son but. – Toby

Répondre

0

Vous ne pouvez pas faire cela directement avec des génériques. Les contraintes génériques doivent spécifier un seul type qui est une contrainte pour toutes les implémentations ... Dans votre cas, il n'y a pas de classe de base commune pour System.String, IList<String> et IList<OntologyStore> qui est une classe de base ou une interface unique à ces types (depuis System.Object et IEnumerable sont les seuls types de base communs, je crois ...)

Cependant, je recommanderais de repenser votre conception pour éviter les génériques, dans ce cas.

Une option pour éviter la duplication des fonctionnalités serait de faire une classe de base, et ont 3 méthodes d'usine qui construit et retourner une sous-classe pour le type en question:

public class Jim 
{ 
    protected Jim() {} 

    public Jim Create(string value) 
    { 
     return new StringJim(value); 
    } 

    private class StringJim : Jim 
    { 
     public StringJim(string value) { // ... 
     } 
    } 
    // Do same for IList<string> and IList<OntologyStore>.. 

    // Add common methods here... 
} 
1

C'est la définition même du cas où vous ne devriez pas essayer de créer une telle classe, mais avoir une interface (ou une base abstraite) et en faire trois classes concrètes différentes.

1

Je pense que votre problème a à faire avec le fait que la classe String n'a pas le constructeur public sans paramètre comme requis par la contrainte "new()".

0

Si vous écrivez une classe générique et que vous faites des choses basées sur le type de T, c'est généralement un signe que ce n'est pas une bonne situation pour les génériques ou que vous ne construisez pas la classe correctement.

Dans ce cas, il semble que ce serait mieux adapté à l'utilisation d'une interface pour donner aux classes un type partagé. S'ils finissent par partager un type d'implémentation, utilisez une classe de base au lieu d'une interface.

Questions connexes