2010-11-18 2 views
3

Я работаю на некоторый код, который ранее был написан другим разработчиком, и я наткнулся на блок кода ниже:C# Наследование и «это» ключевое слово

/// <summary> 
/// Default Constructor. 
/// </summary> 
public Body(Revision parent) 
{ 
    mContainer = parent; 
    mSections = new ArrayList(); 
    mSummary = new ArrayList(); 
} 

/// <summary> 
/// Constructs a Body from specified ParseElement. 
/// </summary> 
/// <param name="parent">Revision container.</param> 
/// <param name="elem">Source ParseElement.</param> 
public Body(Revision parent, ParseElement elem) : this(parent) 
{more constructing stuff} 

Из того, что я понимаю, что перегруженный конструктор также вызовет конструктор по умолчанию с версией, которую я отправляю, в результате чего инициализированные ArrayLists будут доступны из перегруженного конструктора. Это правильно, или я полностью смущен?

+0

Я бы не слишком полагался на документацию XML в этом коде. –

+0

Я знаю ... все это ужасно. – ploosh

ответ

12

Да, это правильно. Однако, чтобы исправить вашу терминологию:

  • Не существует «конструктора по умолчанию», за исключением, возможно, конструктора без параметров, который, как представляется, не существует в этом классе.
  • Это не имеет никакого отношения к наследованию. Этот метод на самом деле называется цепью конструктора.
+0

Также обратите внимание, что ключевое слово 'base' можно использовать для выполнения цепочки конструкторов; разница заключается в том, что он используется для вызова конструктора в классе * base *, тогда как ключевое слово this this используется для вызова конструктора, объявленного в * этом * классе. Также обратите внимание, что указание ни ключевого слова 'this', ни ключевого слова' base' не будет таким же, как указание ': base()', если только ваш класс не является базовым. Если базовый класс не определяет конструктор без параметров, тогда вам будет необходимо явно указать конструктор с ключевым словом 'base'. –

+0

@DWA: За исключением того, что все происходит от какого-либо класса, даже если это неявный суперкласс 'System.Object'. Поэтому было бы правильно сказать, что ': base()' всегда неявно. ;) – cdhowie

+0

Ха-ха, хороший момент! Хотя Эрик Липперт может не согласиться с технической корректностью этого заявления (http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx), для нашего цели (определяющие классы), вы правы. –

3

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

Запуск указанного конструктора до текущего конструктора

Они оба работает против того же экземпляра объекта, так что изменения в вызываемых на видны в оригинал.

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