7

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; }
}

コンパイラーは、:this(0)呼び出しのコメントを解除するときに、「{」が予期されていたことを示すエラーを表示します。このようなことを防ぐためにこの機能が明確に提供されている場合、コードをプライベートメソッドに分解するので、これは面倒です。

私は単にこれを間違っているのですか?区切り文字、セミコロン、コンマを試していません...これは開発チームからの見落としだったようです。なぜこれが省略されたのか、私がこれを間違った方法で行っているのか、誰かが代替案について良い提案をしているのか、私は興味があります。

4

5 に答える 5

9

これは、チェーンの最後で基本コンストラクターを呼び出すことで実現できます。

public Bar(): this(0) {}
public Bar(int schmalue): base(1) {
    // ... initialize
}
于 2011-01-31T19:17:08.933 に答える
3

いいえ、チェーンできるのは1つのコンストラクター(同じクラスの別のコンストラクターまたは基本コンストラクター)のみです。

あなたが何をしようとしているのかははっきりしていません。通常、派生クラスに1つの「プライマリ」コンストラクタを作成する価値があります。派生クラス内の他のすべてのコンストラクタは、「this」を使用してプライマリコンストラクタを呼び出し、「base」を呼び出して適切なベースコンストラクタを呼び出します。

このモデルはすべてのシナリオに適合するわけではありませんが(特に、さまざまな派生コンストラクターからさまざまな基本コンストラクターを呼び出したい場合)、通常は優れたモデルです。

于 2011-01-31T19:16:16.807 に答える
3

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

そのため、両方baseを呼び出すことthisは禁止されています。必要に応じて、委任thisされたコンストラクターが特定のパラメーターを使用してベースを呼び出すようにします。

于 2011-01-31T19:19:30.287 に答える
1

あなたのデザインでは、クラスBarFooクラスの間で多くの共通点を見ることができません。すべてを再実装するときに、なぜFoo派生するのですか?Bar両方のクラスには、パブリックゲッターとプライベートセッターを備えた整数プロパティがあり、両方のクラスには、デフォルトのコンストラクターと、整数プロパティを初期化できるコンストラクターがあります。では、なぜこれら2つのクラスがとにかく存在するのでしょうか。

于 2011-01-31T19:16:18.093 に答える
0

バーの2番目のctorは単に間違っています。試す:

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

最初のコンストラクターのコメントは、次のような意味のようです。

  • schmalue=0でBarを初期化します

  • 値=1でベースctorFooを呼び出します

右?

これを行うには、2番目のctorを置き換え、両方の値を処理できる別の(プライベート)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;
}
于 2011-01-31T19:18:33.470 に答える