Забудьте на мгновение, что Бар происходит от Foo. Если вы сделаете это, звучит так: «Как мне сделать так, чтобы каждый подкласс Foo мог создать Bar, даже если у подкласса нет доступа к конструктору Bar?»
Это довольно легко решить проблему:
public class Foo
{
protected static Bar CreateBarInstance()
{
return new Bar();
}
public virtual Bar CreateBar()
{
return CreateBarInstance();
}
}
public class Bar
{
internal Bar()
{
}
}
public class Baz : Foo
{
public override Bar CreateBar()
{
Bar b = base.CreateBar();
// manipulate the Bar in some fashion
return b;
}
}
Если вы хотите гарантировать , что подклассы Foo не имеют доступа к конструктору Bar, поместите их в другую сборку.
Теперь, чтобы извлечь Bar из Foo, это простое изменение:
public class Bar : Foo
{
internal Bar()
{
}
public override Bar CreateBar()
{
throw new InvalidOperationException("I'm sorry, Dave, I can't do that.");
}
}
«Я не хочу, чтобы конструктор был публичным». Проверьте.
"Только классы, наследуемые от Foo, должны иметь возможность создавать Bars." Проверьте.
«Любой тип Foo должен иметь возможность его создать». Проверьте,
«Любой, кто придет позже и захочет создать свой собственный тип Foo или Baz (что может произойти), будет зависеть от реализации CreateBar () по умолчанию, которая может соответствовать или не соответствовать их потребностям». Я думаю, это очень сильно зависит от того, что должно происходить в методе Foo.CreateBar ().