Несколько вопросов о конструкторах в C # - PullRequest
7 голосов
/ 04 апреля 2011

В C # относительно наследования конструкторов:

  1. Я читал, что конструкторы не могут наследоваться.
  2. Если базовый класс содержит конструктор, один или несколько, производный классдолжен всегда звонить одному из них?Не возможно, что производный класс может пропустить конструктор базового класса?
  3. Производный класс может иметь свой собственный конструктор, но он должен вызывать один из конструкторов базового класса.

Эти утверждения исправляют?

Ответы [ 3 ]

14 голосов
/ 04 апреля 2011
  1. Да, вы правы, конструкторы не наследуются.То есть, если Object имеет конструктор без параметров, это не означает, что, например, String имеет конструктор без параметров.Из раздела 1.6.7.1 спецификации C # 4:

    В отличие от других членов, конструкторы экземпляров не наследуются, и у класса нет конструкторов экземпляров, кроме тех, которые фактически объявлены в классе.Если конструктор экземпляра не предоставлен для класса, то автоматически предоставляется пустой без параметров.

  2. Да, цепочка конструктора конструктора производного класса всегда будет проходить черезего конструктор базового класса ... хотя это может быть косвенно, поскольку он может связываться с другим конструктором в том же классе через this(...) вместо base(...).Если вы не укажете this(...) или base(...), это эквивалентно base() - вызову конструктора без параметров в базовом классе.

См. Мою статью наконструктор цепочки для получения дополнительной информации.

1 голос
/ 04 апреля 2011

1. Вы не можете наследовать конструкторы, но вы можете цепные конструкторы.Пример:

public class DerivedClass : BaseClass {
  public DerivedClass(object arg):base(arg){}
}

2. Да, например, вы не можете создать экземпляр класса, производного от объекта со всеми закрытыми конструкторами (за исключением конкретного сценария, который упоминает Джон нижев своем комментарии) .Вы не можете пропустить конструктор базового класса, но вы можете иметь несколько перегрузок и выбрать конструктор, который вы решите использовать.

3. Да, не уверен, что вопрос здесь.

0 голосов
/ 04 апреля 2011

1 Да

2 Вы не можете пропустить конструктор, но я думаю, что вы ничего не могли сделать в конструкторе по умолчанию.Совсем как

public class PClass {

    protected PClass() {
        // do nothing
    }

    public PClass(int myIntArg) {
        // initialize the class
    }

}

public Class CClass : PClass {

    public CClass(string myStringArg) : base() {
        // initialize the class
    }

}

3 Да.Смотрите мой предыдущий пример.

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