2009-06-30 8 views
1

Je me suis reculé dans un coin. Voici une version simplifiée de ce que j'ai (en C#):Passer des informations à un constructeur sans utiliser de paramètre en C#

class OuterClass 
{ 
    private class BadClass 
    { 
     private int Data; 

     public BadClass() 
     { 
      Data = 0; 

      ... 
     } 
    } 

    T Build<T>(Object Input) 
    { 
     T x = new T(); 
     ... 
     return x; 
    } 

    void SomeMethod() 
    { 
     BadClass a = Build<BadClass>(anObject); 
     ... 
    } 
    ... 
} 

Le problème que j'ai est que je dois maintenant changer la valeur initiale des données en fonction de l'instance de OuterClass qui crée l'instance BadClass. Normalement, je voudrais simplement utiliser un constructeur BadClass qui prend un paramètre:

public BadClass(int Data) 
{ 
    this.Data = Data; 
    ... 
} 

Mais j'utiliser BadClass dans plusieurs types génériques, donc je dois avoir un constructeur BadClass parameterless. Dommage que je ne peux pas faire quelque chose comme ceci:

Build<BadClass(5)>(anObject); 

Alors, comment puis-je donner un constructeur d'informations d'exécution lorsque je ne peux pas passer des paramètres dans le constructeur?
Est-il possible de créer une instance d'exécution d'un type BadClass, de lui donner les informations dont il a besoin, puis de l'utiliser dans mes types génériques?

EDIT: je liste comme un exemple type générique, mais qui n'a pas exprimer pleinement la profondeur de mon dilemme ...
Je peux créer un test Build pour appeler une fonction init si je travaille avec une BadClass, mais c'est très hacky. J'espère trouver une façon un peu moins laide de s'y prendre. Lorsque vous créez le List<BadClass>, vous ne créez aucune instance BadClass.

+0

Pourquoi ne pas surcharger le constructeur? – jle

+0

Je n'ai toujours aucune idée de ce que vous essayez d'accomplir. Le fait que vous passiez un objet à la méthode Build me semble très poisseux. Y a-t-il un modèle que vous essayez de mettre en œuvre? –

+0

Ceci est une version simplifiée. J'essaie juste d'expliquer les contraintes avec lesquelles je travaille. Il s'agit d'un motif d'usine modifié. J'ai plusieurs classes qui ont la même classe de base. J'utilise l'usine (Build ci-dessus) pour générer l'instance appropriée d'une classe. C'est évidemment plus complexe que ce que je montre ici.L'objet qui est passé dans l'usine est un nœud dans un arbre binaire, l'usine détermine où la BadClass doit être insérée dans l'arbre et fait d'autres choses. Il y a plusieurs fonctions d'usine différentes. Je peux utiliser un constructeur en deux étapes, mais ce sera moche. – oillio

Répondre

2

Si vous avez besoin d'avoir plusieurs types de BadClass qui sont des variations de génériques, vous pouvez le faire en changeant votre arbre d'héritage:

class OuterClass { 
    private class BadClassBase { 
     // whatever BadClass does 
    } 
    private class BadClass : BadClassBase { 
     public BadClass(T item) { 
      ... 
     } 
    } 
} 

Vous ne savez pas si c'est ce que vous cherchez mais vous pouvez ensuite créer votre Liste <BadClassBase>.

+0

Ceci est proche de ce dont j'avais besoin. Cela fonctionne très bien tant que les données ont un nombre limité de valeurs valides. J'ai supprimé le constructeur sans paramètre pour BadClass et créé plusieurs classes héritées. J'ai donc BadClass1, BadClass2, etc où leur classe de base est BadClass. Ces classes contiennent uniquement un seul constructeur qui ressemble à: public BadClass1(): base (1) {} – oillio

6

Allez-y et créez un de cette façon, mais lorsque vous créez une instance BadClass à ajouter, c'est lorsque vous appelez votre constructeur paramétrées:

List<BadClass> a = new List<BadClass>(); 
a.Add(new BadClass(1)); 
a.Add(new BadClass(2)); 

Par ailleurs, ayant la construction d'une instance BadClass dépendent des OuterClass est en train de créer c'est un peu d'une odeur de code. Qu'est-ce que vous essayez d'accomplir?

+0

Et pourquoi ne pourriez-vous pas avoir plusieurs constructeurs? ; D 'Mais j'utilise BadClass dans plusieurs types génériques donc je dois avoir un constructeur BadClass sans paramètre' m'a confondu. – wtaniguchi

+0

Liste était un mauvais exemple, un type générique peut certainement créer une instance de BadClass dans son constructeur. Je pourrais probablement travailler de cette façon, mais je pense que mon code sentirait pire si j'avais un constructeur sans paramètre qui ne devrait jamais être utilisé. Aussi, quand j'ai initialement codé BadClass je ne prévoyais pas le besoin d'ajuster les données, évidemment j'ai foutu – oillio

+0

wtaniguchi - Je peux avoir plusieurs constructeurs, mais en utilisant la classe dans un type générique signifie que je DOIT avoir un constructeur sans paramètres. Je ne peux plus construire un constructeur valide sans paramètre. – oillio

1

Pouvez-vous donner à BadClass une méthode d'initialisation?

private class BadClass 
{ 
    private int Data; 

    public BadClass() 
    { 
     Data = 0; 
     ... 
    } 

    public void Init(int dataValue) 
    { 
     Data = dataValue; 
    } 
} 

Ensuite, lorsque vous créez un il est:

BadClass myInst = new BadClass(); // void constructor, as you require. 
myInst.Init(5); // Set the value to 5. 
+1

+1, j'aime ce modèle - c'est ce qu'on appelle la «construction en deux phases» dans (une partie de) la littérature, BTW. –

1

Que diriez-vous de faire quelque chose comme ça?

using System.Collections.Generic; 

class OuterClass 
{ 
    private class BadClass 
    { 
     private int _data; 

     public BadClass() 
     { 
      _data = 0; 

     } 

     public int Data 
     { 
      get 
      { 
      return _data; 
      } 
      set 
      { 
      _data = value; 
      } 
     } 

    } 

    void SomeMethod() 
    { 
     List<BadClass> a = new List<BadClass>() 
     { 
      new BadClass() { Data = 7 }, 
      new BadClass() { Data = 9 } 
     }; 
    } 
} 
Questions connexes