2010-11-18 3 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} 

私が理解からは、ということですオーバーロードされたコンストラクタは、私が送信したリビジョンを持つデフォルトコンストラクタを呼び出して、初期化されたArrayListにオーバーロードされたコンストラクタからアクセスできるようにします。これは正しいのですか、まったく混乱していますか?

+0

私はそのコードのXMLドキュメントにあまり依存しません。 –

+0

私は知っている...すべてが恐ろしいです。 – ploosh

答えて

12

はい、正しいです。ただし、用語を修正するには

  • このクラスには存在しないような、パラメータのないコンストラクタを除いて、「デフォルトのコンストラクタ」はありません。
  • これは、継承とはまったく関係ありません。この手法は、実際にはコンストラクタチェインと呼ばれます。
+0

また、 'base'キーワードを使用してコンストラクタチェインを実行できます。違いは、それが* base *クラスのコンストラクタを呼び出すのに使われているのに対し、 'this'キーワードはここで* this *クラスで宣言されたコンストラクタを呼び出すために使われます。また、 'this'キーワードも' base'キーワードも指定しないことは、あなたのクラスが基本クラスから派生しない限り、実質的に ':base()'と同じです。基本クラスがパラメータのないコンストラクタを定義していない場合は、 'base'キーワードでコンストラクタを明示的に指定する必要があります。 –

+0

@DWA:暗黙的なスーパークラス 'System.Object'でもすべてがいくつかのクラスから派生していることを除いて。ですから、 ':base()'は常に暗黙的であると言うのは正しいでしょう。 ;) – cdhowie

+0

ハハ、良い点! Eric Lippert氏は、その声明(http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx)の技術的正確性に同意しないかもしれませんが、目的(クラスを定義する)が正しいことを確認します。 –

3

これは正しく、テクニックはコンストラクタチェーンと呼ばれます。このシナリオではthis通話が緩くに呼ばれるの変化が中に表示されるように、彼らの両方が同じオブジェクトインスタンスに対して実行

現在のコンストラクタの前に

実行指定されたコンストラクタを言うように可視化することができます元の。