2009-11-02 2 views
1

Привет, я являюсь нищим в C#. У меня этот класс. Класс class1 имеет много переменных.Начальные проблемы со многими входными параметрами

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

и класс class2 с помощью метода doSomethig:

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

Я использую instace из class1 и class2 в class3.

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

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

} 

Проблема Слово в методе Class3 DoSomething из class2 и входные параметры метода DoSomething являются переменными из class1. Я хотел бы иметь меньше параметров в методе doSomething. Я думаю, добавьте переменные из класса 1 в структуру или в класс. Каков наилучший способ? Спасибо.

ответ

7

Попробуйте передать объект СЕБЯ.

obj2.doSomething(obj1); 

Если вы предоставляете доступ общественности, чтобы получить переменные, то ваш метод class2 будет иметь возможность получить доступ к значениям, и вы будете освободить нагрузку на определении метода и призвании.

+0

Отличная идея с одной оговоркой: образец кода, пока он показан p rovides не модифицирует поля, поэтому они по умолчанию являются закрытыми. Перед этим он должен сделать их как внутренними, так и общественными. –

+1

Несомненно, отсюда: «Если вы предоставляете публичный доступ, чтобы получить переменные» – Quibblesome

+0

Понимание чтения FTW. :) –

0

Прежде всего, вы не должны предоставлять прямой доступ к полям своего класса. Как это выглядит, как Java, вы должны получить и установить методы доступ к полям:

public String getVariable1() 
{ 
    return variable1; 
} 

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

EDIT: Как это C# это должно быть:

public String Variable1 
{ 
    get; 
    set; 
} 

Далее, чтобы ответить на ваш вопрос, метод йоЗотеЬЫпд в class2 может просто взять экземпляр class1:

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

Это C#, а не Java - и поля по умолчанию являются закрытыми в C#. –

+0

Справедливая точка. Просто заметил нижний регистр в его объявлении строки. – Phill

+0

Тег C# и первое предложение вопроса являются менее тонкими подсказками;) –

3

было бы более целесообразно использовать массив строк (строка [] переменные) вместо variable1, variable2 и т.д.? Или какой-то словарь?

Если класс 1 содержит только параметры для функции, другая альтернатива передать весь объект функции:

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

+1 для разных подходов с использованием массивов, словарей. – Audrius

0

Вы можете использовать структуры для отправки, что значения:

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

И используйте следующие формы:

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

Мутируемые структуры злы ... и структуры с большим количеством полей, как правило, обескуражены тоже.Что заставляет вас думать, что структура здесь уместна? –

+0

Я думал, что могу предложить просто объединить все эти параметры в уникальную стратегию, чтобы избежать метода со многими аргументами; можете ли вы указать ресурс, чтобы узнать больше о изменяемых структурах? спасибо за ваши отзывы, jon. –

Смежные вопросы