Учитывая следующее дерево наследования, какой был бы лучший способ его реализации таким образом, который работает?
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 будет делать прокси и беспокоиться о ограничении диапазона и т.д.