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