web-dev-qa-db-ja.com

パラメーター付きの基本クラスコンストラクターによる継承

簡単なコード:

class foo
{
    private int a;
    private int b;

    public foo(int x, int y)
    {
        a = x;
        b = y;
    }
}

class bar : foo
{
    private int c;
    public bar(int a, int b) => c = a * b;
}

Visual Studioはbarコンストラクターについて不平を言っています:

エラーCS7036 foo.foo(int, int)の必須の仮パラメーターxに対応する引数が指定されていません。

何?

78
zeusalmighty

問題は、基本クラスfooにパラメーターなしのコンストラクターがないことです。したがって、派生クラスのコンストラクターからのパラメーターを使用して、基本クラスのコンストラクターを呼び出す必要があります。

public bar(int a, int b) : base(a, b)
{
    c = a * b;
}
140
Dmitry

私は間違っている可能性がありますが、fooを継承しているため、ベースコンストラクターを呼び出す必要があります。 fooコンストラクターを明示的に定義して(int、int)を要求するので、今度はそれをチェーンに渡す必要があります。

public bar(int a, int b) : base(a, b)
{
     c = a * b;
}

これにより、fooの変数が最初に初期化され、次にbarで使用できます。また、混乱を避けるために、インスタンス変数とまったく同じパラメーターに名前を付けないことをお勧めします。代わりにp_aまたは何かを試してください。そうすれば、間違った変数を誤って処理することはありません。

23
guitar80