В C# 4, как я могу иметь конструкторы с необязательными параметрами в подклассе родителя с перегруженным конструктором?

У меня есть родительский класс, который имеет перегруженный конструктор, и у меня есть подкласс, который имеет конструктор с необязательными параметрами. Есть ли способ, чтобы конструкторы подкласса все еще выставляли перегруженность родительского класса, сохраняя его собственные необязательные параметры?

Вот пример кода двух классов и их обязательных конструкторов:

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 = "")

Я думаю, я нашел решение, но я не уверен, что оно настолько чистое, как могло бы быть. Я разместил это как ответ только на тот случай, если это единственный вариант.

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

Это кажется немного нечистым, потому что я не соединяю конструкторы подкласса вместе и вместо этого вызываю функцию, но я не могу придумать другого способа сделать это.

Если вы можете изменить 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
    }
}
Другие вопросы по тегам