C # - Цепной вызов конструктора - PullRequest
2 голосов
/ 04 августа 2011

В настоящее время я изучаю C # и изучаю конструкторы и вызовы цепочек конструкторов, чтобы не вставлять один и тот же код (одно и то же значение для переменных) в каждый конструктор.

Iиметь три конструктора, один без параметров, один с тремя параметрами и один с четырьмя параметрами.Что я хочу сделать, это использовать конструктор по умолчанию для вызова конструктора с тремя параметрами, передавая значения по умолчанию для параметров (переменных) и конструктор, который имеет три параметра, я ищу, чтобы вызвать конструктор с четырьмяпараметры.Кажется, я отсортировал первый список, в котором перечислены значения по умолчанию, но я изо всех сил пытаюсь написать конструктор с тремя параметрами, а затем заставить его вызвать конструктор с четырьмя параметрами, если это необходимо.все переменные экземпляра типа string to string.Empty.

public Address()
{
   m_street = string.Empty;
   m_city = string.Empty;
   m_zipCode = string.Empty;
   m_strErrMessage = string.Empty;
   m_country = Countries;
}


public Address(string street, string city, string zip)
{
}

public Address(string street, string city, string zip, Countries country)
{
}

Я хотел сделать следующее, но оно не работает: -

public Address(string street, string city, string zip)
     : this street, string.Empty, city, string.Empty, zip, string.Empty
{
}

Ответы [ 6 ]

11 голосов
/ 04 августа 2011

Обычно вы должны связать конструктор с информацией наименьшего на один с информацией most , а не наоборот. Таким образом, каждое поле может быть назначено точно в одном месте: конструктор с наибольшим количеством информации. Вы на самом деле описали такое поведение в своем посте - но тогда ваш код делает что-то совершенно другое.

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

: this(arguments)

Например:

public class Address
{
    private string m_street;
    private string m_city;
    private string m_zipCode;
    private string m_country;

    public Address() : this("", "", "")
    {
    }


    public Address(string street, string city, string zip)
        : this(street, city, zip, "")
    {
    }

    public Address(string street, string city, string zip, string country)
    {
        m_street = street;
        m_city = city;
        m_zip = zip;
        m_country = country;
    }
}

Для получения дополнительной информации о цепочке конструктора см. эту статью Я написал некоторое время назад.

3 голосов
/ 04 августа 2011

Вам нужно ():

public Address(string street, string city, string zip)
      : this(street, string.Empty, city, string.Empty, zip, string.Empty)
{
}

Это вызовет конструктор адресов с указанием 3 из 6 аргументов (если он есть), это то, что вы пытаетесь сделать?

1 голос
/ 04 августа 2011

Идея состояла бы в том, чтобы оставить логику создания экземпляра для конструктора, который принимает большинство параметров, и использовать другие как методы, которые только передают значения этому конструктору, таким образом, вы пишете код только один раз.1002 * Попробуйте это:

public Address() 
  : this(String.Empty, String.Empty, String.Empty)
{
}


public Address(string street, string city, string zip) 
  : this(street, city, zip, null)
{
}

public Address(string street, string city, string zip, Countries country) 
{
    m_street = street;
    m_city = city;
    m_zipCode = zip;
    m_country = Countries;
    m_strErrMessage = string.Empty;
}
1 голос
/ 04 августа 2011

Вы можете использовать this для вызова других конструкторов того же объекта. Общая идея состоит в том, чтобы выполнить фактическую инициализацию свойств / полей в самом сложном конструкторе и последовательно упростить цепочки, давая значения по умолчанию.

Предполагается, что Countries - это Enum, например:

public enum Countries
{
   NotSet = 0,
   UK,
   US
}

Вы можете сделать это (обратите внимание, что ваше перечисление не обязательно должно иметь состояние по умолчанию, например NotSet, но если это не так, вам просто нужно решить, какое значение по умолчанию, если значение не указано):

public Address()
  :this(String.Empty,String.Empty,String.Empty)
{        
}

public Address(string street, string city, string zip)
  :this(street,city,zip,Countries.NotSet)
{
}

public Address(string street, string city, string zip, Countries country) 
{ 
    m_street = street;
    m_city = city
    m_zipCode = zip;
    m_country = country;
}
1 голос
/ 04 августа 2011

Ваш синтаксис близок.Попробуйте это

public Address(string street, string city, string zip)
      : this( street, string.Empty, city, string.Empty, zip, string.Empty )
{
}

В вашем примере вы также должны удалить конструктор по умолчанию и поместить инициализацию переменных в конструктор, который находится в конце цепочки.Это тот, который берет страну в вашем примере.

Надеюсь, это поможет.

0 голосов
/ 04 августа 2011

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

public Address(string street, string city, string zip)
          : this (street, string.Empty, city, string.Empty, zip, string.Empty)
    {
    }

Также вы вызываете конструктор с 6 параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...