Учитывая следующее дерево наследования, какой был бы лучший способ его реализации таким образом, который работает?
abstract class Foo<T> : IEnumerable<T>
{
public abstract Bar CreateBar();
}
class Bar<T> : Foo<T>
{
// Bar provide a proxy interface to Foo and limit access nicely.
// The general public shouldn't be making these though, they have access
// via CreateBar()
protected Bar(Foo base)
{
// snip...
}
}
class Baz<T> : Foo<T>
{
public Bar CreateBar()
{
return new Bar(this);
}
}
Это не выполняется: 'Bar.Bar()' is inaccessible due to its protection level
.
Я не хочу, чтобы конструктор был общедоступным, только классы, которые наследуют от Foo
, должны иметь возможность создавать Bar
s. Bar
является специализированным Foo
, и любой тип Foo
должен иметь возможность его создать. Public internal является "опцией" здесь, так как большинство предопределенных расширений для Foo
будет внутренним для DLL, но я считаю это неаккуратным ответом, так как любой, кто приходит позже, который хочет создать свой собственный тип Foo
или Baz
(что может случиться) будет зависеть от реализации по умолчанию CreateBar()
, которая может или не может удовлетворить их потребности.
Возможно, есть способ рефакторинга, чтобы он работал хорошо? Я стучу головой о стену, пытаясь разработать это, чтобы он работал.
Изменить (дополнительная информация):
Чуть более конкретный: Foo реализует IEnumerable и длинную историю, Bar предоставляет тот же интерфейс, но ограниченному подмножеству этого перечислимого объекта. Все Foo должны иметь возможность создавать подмножества самих себя (например, Bar) и возвращать их. Но я не хочу, чтобы все, кто когда-либо хотел реализовать Foo, должны были беспокоиться об этом, потому что Bar будет делать прокси и беспокоиться о ограничении диапазона и т.д.