конструкторы this () и base () в C # - PullRequest
7 голосов
/ 31 января 2011

Кажется, что нет никакого синтаксиса языка для указания и this () и base () конструктор.Учитывая следующий код:

public class Bar : Foo
{
    public Bar()
      :base(1)
      //:this(0)
    { }
    public Bar(int schmalue)
      :Foo(1)
    {
       //Gobs of initialization code
       ...
       Schmalue = schmalue;
    }

    public int Schmalue { get; private set; }
}

public class Foo
{
    public Foo()
    {
        Value = 0;
    }

    public class Foo(int value)
    {
        Value = value;
    }

    public int Value { get; private set; }
}

Компилятор выдает ошибку, в которой говорится, что ожидалось '{' при раскомментировании вызова: this (0).Это мешает, потому что заставляет меня выделять код в приватный метод, когда эта функциональность была явно предоставлена ​​для предотвращения подобных вещей.

Я просто делаю это неправильно?Я не пытался использовать разделитель, точку с запятой, запятую ... Кажется, это была просто недосмотр со стороны команды разработчиков.Меня интересует, почему это было опущено, если я поступаю неправильно, или у кого-нибудь есть хорошие предложения по альтернативам.

Ответы [ 5 ]

9 голосов
/ 31 января 2011

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

public Bar(): this(0) {}
public Bar(int schmalue): base(1) {
    // ... initialize
}
3 голосов
/ 31 января 2011

Подумайте, что бы произошло, если бы вы могли назвать и this, и base как конструкторы в одном конструкторе.Давайте предположим, что сначала будет вызван базовый конструктор.Затем будет вызван конструктор this, который сам вызовет базовый конструктор.Таким образом, базовый класс будет создан дважды.Это нарушает семантику конструкторов, а именно, что объект создается один раз.

Таким образом, вызов base и this запрещен.Пусть ваш делегированный конструктор this вызывает базу с конкретными параметрами, если это необходимо.

3 голосов
/ 31 января 2011

Нет, вы можете связать только один конструктор - либо другой конструктор в том же классе, либо базовый конструктор.

Не совсем понятно, что вы пытаетесь сделать. Обычно я считаю, что стоит создать один «первичный» конструктор в производном классе: все остальные конструкторы в производном классе используют «this» для вызова первичного, который вызывает «base» для вызова соответствующего базового конструктора.

Хотя эта модель не подходит для каждого сценария - особенно когда вы хотите вызывать разные базовые конструкторы из разных производных конструкторов - это обычно хорошая модель.

1 голос
/ 31 января 2011

В вашем дизайне я не вижу много общего между классами Bar и Foo. Почему Foo происходит от Bar, когда вы переопределяете все? Оба класса имеют целочисленное свойство с общедоступным и частным установщиком, и оба класса имеют конструкторы по умолчанию и конструктор, позволяющий инициализировать целочисленное свойство. Так почему же эти два класса существуют в любом случае?

0 голосов
/ 31 января 2011

Второй ctor в Bar просто неправильный. Попробуйте:

public Bar(int schmalue)
  :base(1) //would call Foo(1)
{
   //Gobs of initialization code
   ...
   Schmalue = schmalue;
}

Комментарий в первом ctor, кажется, что-то вроде

  • инициализировать Bar с помощью schmalue = 0

  • вызов базы ctor Foo со значением = 1

правый

Для этого замените второй ctor и просто добавьте другой (приватный) ctor, который может обрабатывать оба значения

public Bar(int schmalue)
  :this(1, schmalue) //would call Bar(1, schmalue)
{
}

private Bar(int value, int schmalue)
 :base(value)
{
    //Gobs of initialization code
   ...
   Schmalue = schmalue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...