Есть несколько классов со сложной логикой внутри. Для инфраструктуры приложения должны быть доступны untyped-версии методов, для бизнес-логики желательно иметь красивую типизированную обёртку c парой свойств и методов.
Если решать в лоб (сампл взят из головы):
abstract class OptionSet
{
public abstract object this[object key]
{
get;
set;
}
}
class SomeOptionSet: OptionSet
{
public SomeOption1
{
get { return base["SomeOption1"]; }
}
public SomeOption2
{
get { return base["SomeOption2"]; }
}
}
из typed-обёрток (SomeOptionSet) будут торчать наружу внутренности (в примере — индексер, у настоящих классов — зоопарк из методов и свойств).
Спрятать OptionSet в приватное поле не выйдет: куча кода, вызываемого из бизнес-логики, принимает OptionSet в качестве параметра.
Можно объявить внутренности как protected internal. Единственный недостаток: вся инфрастуктура должна будет жить в той же сборке, что и OptionSet. Уже сейчас не выйдет: инфраструктура расширяемая
Вариант 3 — объявить внутренности как protected, дополнительно ввести интерфейс IOptionSet и предоставить доступ к внутренностям через явную реализацию интерфейса.
Ещё идеи?