2009-11-02 4 views
1

Salut, je suis begginner en C#. J'ai cette classe. La classe class1 possède plusieurs variables.Problèmes débutants avec de nombreux paramètres d'entrée

class class1 
{ 
string variable1; 
string variable2; 
//... 
string variable10 
} 

et classe class2 avec la méthode doSomethig:

class class2 
{ 
void doSomething(string s1, string s2, ..., string s10) 
} 

J'utilise instace des classes 1 et class2 dans class3.

class class3 
{ 
class1 obj1 = new clas1(); 
class2 obj2 = new clas2(); 

//... 
string result = obj.doSomething(obj1.variable1, obj1.variable2, ... , obj1.variable10) 

} 

problème est que j'appelle la méthode doSomething class3 de class2 et les paramètres d'entrée à la méthode doSomething sont des variables de classe 1. Je voudrais avoir moins de paramètres dans la méthode doSomething. Je pense ajouter des variables de class1 dans la structure ou dans la classe. Quel est le meilleur moyen ? Remercier.

Répondre

2
class class2 
{ 
    void doSomething(class1 obj) {...} 
} 
7

Essayez de passer l'objet LUI-MÊME.

obj2.doSomething(obj1); 

Si vous fournissez l'accès du public pour obtenir les variables, alors votre méthode class2 sera en mesure d'accéder aux valeurs et vous relâchez la pression sur votre définition de la méthode et de l'appel.

+0

Une excellente idée avec une mise en garde: l'échantillon de code comme il est montré p ne fournit aucun modificateur aux champs, ils sont donc privés par défaut. Il devra les rendre internes ou publiques avant de le faire. –

+1

Bien sûr, d'où: "Si vous fournissez un accès public pour obtenir les variables" – Quibblesome

+0

Compréhension à la lecture FTW. :) –

0

Tout d'abord, vous ne devez pas fournir un accès direct aux champs de votre classe. Comme cela ressemble à Java, vous devriez avoir obtenir et de définir des méthodes pour accéder aux champs:

public String getVariable1() 
{ 
    return variable1; 
} 

public void setVariable1(String var1) 
{ 
    variable1 = var1; 
} 

EDIT: Comme il est C# il devrait être:

public String Variable1 
{ 
    get; 
    set; 
} 

Suivant pour répondre à votre question, la méthode doSomething dans class2 peut simplement prendre une instance de classe 1:

public String doSomething(Class1 class1Instance) 
{ 
    // implementation of doSomething goes here and accesses class1Instance.getVariable1() -> getVariable10(); 
} 
+0

C'est C#, pas Java - et les champs par défaut sont privés en C#. –

+0

Fair point. Juste remarqué les minuscules s sur sa déclaration de chaîne. – Phill

+0

La balise C# et la première phrase de la question sont des indices moins subtils;) –

3

serait-il plus approprié d'utiliser un tableau de chaînes (string [] variables) au lieu de variable1, variable2, etc? Ou un dictionnaire d'une sorte?

Si la classe 1 ne contient que les paramètres de la fonction, une autre alternative est de passer l'objet entier à la fonction:

class class2 
{ 
    void doSomething(class1 c) { ... } 
} 
+0

+1 pour différentes approches utilisant des tableaux, des dictionnaires. – Audrius

0

Vous pouvez utiliser des structures pour envoyer les valeurs:

struct Data 
{ 
    public int Var01 { get; set; } 
    public int Var02 { get; set; } 
    // ... 
    public int Var10 { get; set; } 
} 

Et utilisez ceux comme ceci:

doSomething(new Data() 
{ 
    Var01 = 1, 
    Var02 = 2, 
    Var10 = 10 
}); 
+2

Les structures mutables sont mauvaises ... et les structures avec beaucoup de champs sont généralement découragées aussi.Qu'est-ce qui vous fait penser qu'une structure est appropriée ici? –

+0

Je pensais que je pourrais suggérer simplement de regrouper tous ces paramètres dans une struture unique, pour éviter la méthode avec beaucoup d'args; pouvez-vous s'il vous plaît pointer vers une ressource pour en savoir plus sur les structures mutables? merci pour vos commentaires, jon. –

Questions connexes