6

オーバーロードされたコンストラクターを持つ親クラスがあり、オプションのパラメーターを持つコンストラクターを持つサブクラスがあります。サブクラスのコンストラクターが、それ自体のオプションのパラメーターを保持しながら、親クラスのオーバーロードを公開する方法はありますか?

2つのクラスとそれらに必要なコンストラクターのサンプルコードを次に示します。

class Foo {
    Foo(String arg0) 
    {
      // do some stuff with arg0
    }

    Foo(String arg0, List<x> arg1)
        : this(arg0)
    {
      // do some other stuff with arg1 that is special because we have an arg1
    }
}

class Bar : Foo {
    Bar(String arg0, List<y> arg2 = null, String arg3 = "") 
        : base(arg0)
    {
      // some third thing with arg2 and arg3
    }
}

これは、親コンストラクターのオーバーロードを公開する必要がある他のサブクラスコンストラクターのメソッドシグネチャですが、問題はそれをどのように行うかです。

Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "")

私は解決策を見つけたと思いますが、それが可能な限りきれいかどうかはわかりません。それが唯一の選択肢である場合に備えて、私はそれを答えとして投稿しました。

4

2 に答える 2

4

オプションのパラメーターを持つコンストラクターを1つだけにするように変更できる場合Fooは、次のことを実行できます。

public class Foo
{
    public Foo(String arg0, List<x> arg1 = null)
    {
        // do some stuff with arg0
        if (arg1 != null)
        {
            // do some other stuff with arg1
        }
    }
}

public class Bar : Foo
{
    public Bar(String arg0, List<x> arg1 = null, List<y> arg2 = null, String arg3 = "")
        : base(arg0, arg1)
    {
        // some third thing with arg2 and arg3
    }
}
于 2011-05-06T19:11:13.100 に答える
2

これが私が思いついた解決策です:

class Foo {
    Foo(String arg0) 
    {
      // do some stuff with arg0
    }

    Foo(String arg0, List<x> arg1)
        : this(arg0)
    {
      // do some other stuff with arg1
    }
}

class Bar : Foo {
    Bar(String arg0, List<y> arg2 = null, String arg3 = "") 
        : base(arg0)
    {
        this.Initialize( arg2, arg3);
    }

    Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "")
        : base(arg0, arg1)
    {
      this.Initialize( arg2, arg3);
    }

    private void Initialize(List<y> arg2, String arg3)
    {
      // some third thing with arg2 and arg3
    }
}

サブクラスのコンストラクターをチェーン化しておらず、代わりに関数を呼び出しているため、少し汚れているように見えますが、これを行う他の方法を理解することはできません。

于 2011-05-06T18:56:19.393 に答える