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

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

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

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 ]

3 голосов
/ 06 мая 2011

Если вы можете изменить 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
    }
}
1 голос
/ 06 мая 2011

Вот решение, которое я придумала:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...