Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Вызов одного конструктора из другого


Автор: N1ko 13.4.2010, 14:01
Здравствуйте. Есть следующая ситуация. На форме есть кнопка Button1, при нажатии на котоую выполняется следующий код.
       
Код

 public OracleDB DB;
        private void button1_Click(object sender, EventArgs e)
        {
            DB = new OracleDB();
        }
        //Этот код выполняется при нажатии на вторую кнопку
        private void button2_Click(object sender, EventArgs e)
        {
            ///!!! Вот тут говорит, что DB.password равен "", а мне нужно что бы оно отображало значение, введёное на форме _formLogIn
            MessageBox.Show(DB.password);
        }

 Где OracleDB - класс для работы с соответствующей базой данных.
Конструктор выгялдит следующим образом.

Код

 public OracleDB()
        {
            FormLogIn _formLogIn = new FormLogIn(this);
            _formLogIn.Show();
        }


 где FormLogIn - форма для авторизации. На этой форме есть кнопка подтверждения, код для которой приведён ниже. Он вызывает конструктор того же класса только с параметрами: пароль и логин.
Код

oracleDB = new OracleDB(TextBoxUserID.Text,TextBoxPassword.Text);
 
Сам же конструктор выглядит вот как:
 
Код

public OracleDB(string UserID, string Password)
        {
            this.sUserID = UserID;
            this.sPassword = Password;
            oracleCon = new OracleConnection(ConnectionParams);
        }

В результате мне нужно, что бы изначально созданное поле DB отражало класс OracleDB, который был создан вторым конструктором. Но  он хранит в себе информацию, которая была внесена после применения первого конструктора.
Если изложеный текст не понятен, могу выложить проект. Надеюсь на Вашу помощ. 

Автор: A5uKa 13.4.2010, 14:37
Код

 public OracleDB()
{
            FormLogIn _formLogIn = new FormLogIn(this);
            _formLogIn.Show();
}


public virtual _formLogIn.OnChangePasswordAndAccountName(...)
{
            OracleDB.sUserID = UserID;
            OracleDB.sPassword = Password;
            OracleDB.oracleCon = new OracleConnection(ConnectionParams);
}


или ...

Код

        private void button1_Click(object sender, EventArgs e)
        {
           DB = new  _formLogIn.GetOracleDB();
        }

............
    GetOracleDB(....)
    {
         oracleDB = new OracleDB(TextBoxUserID.Text,TextBoxPassword.Text);
         return oracleDB 
     }


А возвращать в конструкторе OracleDB OracleDB как-то неправильно.
Элементарно потому, что у него нет возвращаемого типа, потому, что он возвращает свой класс, на то он собственно и конструктор.

Автор: N1ko 13.4.2010, 15:02
Со вторым вариантом понятно. А какая мысль заложена в первый?  Создать метод, который будет просто присваивать значения определённым полям, не вызывая конструктор? И почему он виртуальный?

Автор: A5uKa 13.4.2010, 15:08
1) Да
2) Да просто так

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)