2011-07-17 5 views
19

これは簡単に回避できますが、言語機能を使用できるかどうか、あるいは言語によっては禁止されているということがクラス設計に論理的な誤りを起こしているということだけが不思議です。どのように私は両方のコンストラクタの初期化子、base()とthis()を呼び出しますか?

私は再利用のためにそれを「硬化」を助けるために私のコードの自己評価をやっていると私はちょうどaccrossに来た:

public partial class TrackTyped : Component 
{ 
    IContainer components = null; 

    public TrackTyped() 
     : base() 
    { 
     InitializeComponent(); 
    } 

    public TrackTyped(IContainer container) 
     : base() 
    { 
     container.Add(this); 
     InitializeComponent(); 
    } 
} 

を私は同じコード行を見たとき、私は通常、何2つのコンストラクタは "this()"でもう一方の呼び出しを行いますが、私はそれを行うように見えません。私が唯一それらのいずれかを持つことができると言っています

10.11 Instance Constructors 
    constructor-declarator: 
     identifier ( formal-parameter-listopt ) constructor-initializeropt 
    constructor-initializer: 
     : base ( argument-listopt ) 
     : this ( argument-listopt ) 

:私はスペック権利を読めば

は(私はちょうどので、私は右ではないかもしれないスペックを読み取ろうと始めました)。

質問:10.11は両方を呼び出す必要がないことを意味するか、または単に言語が呼び出すことだけをサポートしていることを暗示していますか?

+0

ありがとうございました(分かりましたが、分かりませんでした。分前に)回答: –

+0

いいえ、私は何らかの理由で自分自身の答えを考えていませんでした - 私はcontainer.Addと思わない)は、InitializeComponent()の前に発生する必要があります - それは私はおそらくそれが賢いデザインの兆候だったと自分自身に尋ねるだろう。この例では –

+0

、 "new TrackedType()"が最初に実行され、次に.Add()が実行されます。個人的には、私はそれをより明確に見出します。おそらく後でそのことを覚えておいてください。 – sgtz

答えて

16

thisbaseを呼び出す別のコンストラクタにリダイレクトするため、両方を呼び出す必要はありません。

2

これはあなたが探しているものですか?二CTORを削除すると、これはあなたのために明確になりますされてやっている場合

var a = TrackTyped(container); 

私は不思議:

public partial class TrackTyped : Component 
{ 
    IContainer components = null; 
    public TrackTyped() : base() 
    { 
     // logic for InitializeComponent() here 
    } 

    public TrackTyped(IContainer container) : this() 
    { 
     container.Add(this) 
    } 
} 

ところで:それは、第二のctorのための興味深い使い方ですか? (同じ最終結果)

container.Add(new TrackTyped()); 
+0

あなたは細かい点を作っていますので、一層深く掘り下げて、私のコンポーネントをWinformsデザイナで使用できるようにすることができました。このコンポーネントは自動的にインクルードコンポーネントの初期化ルーチンに行を追加します:this.trackTypedTextComponent1 = new EomApp1 Components.TrackTyped(this.components); –

7

あなたはそうではありません。 :this(...)によって同じクラスの別のコンストラクターにコンストラクター呼び出しを転送できます。そのチェーンの最後のコンストラクタは、暗黙的にまたは明示的にベースを初期化する必要があります。:base(...)

クラスAに2つのコンストラクタがあるとします。 1つは:base(2)で基底を初期化し、もう1つは:base(3)で初期化します。最初のコンストラクタにも:this (/*call the other ctor*/)を指定することが許可されている場合、ベースがどのように初期化されるべきか:2または3?しかし、

public partial class TrackTyped : Component 
{ 
    IContainer components = null; 

    public TrackTyped() 
     : base() 
    { 
     InitializeComponent(); 
    } 

    public TrackTyped(IContainer container) 
     : this() 
    { 
     container.Add(this); 
    } 
} 

二コンストラクタ内の文の順序は今異なっている:これらの事は

7

これはあなたが望むもののようですが許可されていない理由です。それが重要なのであれば、実際にあなたが望むことをする良い方法はありません。同じの行を持っていても、機能は微妙に異なります。その場合は、1行だけ繰り返す必要があります。それを汗ばませないでください。

あなたは仕様を正しく読んでいます:それはどちらか一方でなければなりません。

関連する問題