2011-01-31 10 views
6

this()コンストラクタとbase()コンストラクタの両方を指定する言語構文はないようです。次のコードを考える:この(0)の呼び出し:C#の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; } 
} 

コンパイラは私にコメント解除したときに「{」が期待されたことを示すエラーが発生します。これは、この機能が明らかにそのようなことを防ぐために提供されたとき、プライベートメソッドに私のコードを取り除く原因となるので、迷惑です。

私は単にこれを間違っていますか?私は区切り文字、セミコロン、カンマを使用しようとしなかった...これは開発チームの監視に過ぎないようだ。私はこれを間違った方法でやっている場合や、誰かが代替案を提案している場合、これがなぜ省略されたのかに興味があります。

+1

[C#でオーバーライドされたコンストラクタとベースコンストラクタを呼び出す可能性があります](http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded

+2

ありがとう答えの基本的には、this()が別の基本コンストラクタを呼び出す可能性があるという問題があります。 – Sprague

答えて

8

あなたがチェーンの最後でベースのコンストラクタを呼び出すことによって、これを達成することができます

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
+0

ありがとう、これは答えです。あなたが似たようなことを明記した後の多くの人は(もっと明示的に)これは間違いありません。 – Sprague

3

いいえ、同じクラスの別のコンストラクタまたはベースコンストラクタのいずれかに1つのコンストラクタのみを連結できます。

あなたがしようとしていることは本当に明確ではありません。一般的に、派生クラスには1つの "プライマリ"コンストラクタを作成する価値があることがわかります。派生クラス内の他のコンストラクタはすべて、 "this"を使ってプライマリコンストラクタを呼び出します。

そのモデルは、すべてのシナリオに適合していませんが - 特にあなたが異なる派生コンストラクタから別の基本コンストラクタを呼び出したいとき - それは通常良いモデルです。

1

あなたのデザインでは、BarFooクラスの間に多くの共通のものはありません。すべてを再実装したときにFooBarから派生するのはなぜですか?どちらのクラスもpublic getterとprivate setterを持つ整数プロパティを持ち、両方のクラスにはデフォルトのコンストラクタと、整数プロパティを初期化できるコンストラクタがあります。とにかく、なぜこれら2つのクラスが存在するのですか?

0

バーで二ctorのは、単に間違っています。試してみてください:

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

最初のctorでのコメントは

  • のようなものが= 1

値でschmalue = 0

  • コールベースCTORのはFooとバーを初期化する意味のようです

    右?二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; 
    } 
    
  • 3

    を扱うことができ、別の(プライベート)ctorのを追加し、それを行うために

    は、あなたが1つのコンストラクタでのコンストラクタとしてthisbaseの両方を呼び出すことができたらどうなるか考えてみましょう。最初に基本コンストラクタが呼び出されると仮定しましょう。次に、thisコンストラクタが呼び出されます。それ自体は基本コンストラクタを呼び出します。したがって、基本クラスは2回インスタンス化されます。これはコンストラクタのセマンティクスを破ります。つまり、オブジェクトは一度構築されます。

    このように、basethisの両方を呼び出すことは禁止されています。委任されたthisコンストラクタに、必要な場合は特定のパラメータでベースをコールさせます。

    関連する問題