У меня есть класс, FooBarSet
с одним «ядром» блока логики инициализации.Как я могу поделиться кодом конструктора с членами класса readonly?
A FooBar
изготовлен из Foo
и Bar
. Класс FooBarSet
инициализируется списком FooBar
. FooBarSet
может также быть инициализирован отдельными параллельными Foo
и Bar
списками.
В идеале, я мог бы работать так:
public class FooBarSet
{
private readonly List<FooBar> _list;
// Primary constructor.
public FooBarSet(List<FooBar> foobarList)
{
// Contracts and initialization...
_list = foobarList;
}
// Secondary constructor.
public FooBarSet(List<Foo> fooList, List<Bar> barList)
{
// Zip a new list of new FooBars
var zipped = fooList.Zip(barList,
(foo, bar) => new FooBar(foo, bar));
// Call primary constructor with zipped list.
this(zipped);
}
}
Это C#, а не Java, поэтому this(zipped)
является незаконным. Общее решение, as in this answer, чтобы вытащить инициализации ядра в общий частный метод:
public class FooBarSet
{
private readonly List<FooBar> _list;
// Common "constructor" called from actual constructors.
private Init(List<FooBar> foobarList)
{
// Contracts and initialization...
_list = foobarList;
}
public FooBarSet(List<FooBar> foobarList)
{
Init(foobarList);
}
public FooBarSet(List<Foo> fooList, List<Bar> barList)
{
var zipped = fooList.Zip(barList,
(foo, bar) => new FooBar(foo, bar));
Init(zipped);
}
}
Однако, это не работает, либо из-за readonly _list
поля.
Предполагая, что _list
должно быть readonly
, как я могу заставить эти конструкторы делиться кодом инициализации?
'_list = Init (foobarList)' в конструкторе? Создайте 'Init', вместо этого верните' List''. –
@RonBeyer, мне это очень нравится. Он будет работать для моей реальной реализации, а не только для [MWE] (https://en.wikipedia.org/wiki/Minimal_Working_Example), который я использовал. Бросьте это как ответ, и это ваше, пока что-то безумное красивое не всплывает. – kdbanman
Замечание: только список _reference_ в списке только для чтения, вы можете изменять ** содержимое ** всякий раз, когда захотите. Очевидное решение, затем .... –