Проблема инкапсуляции и вложенных классов
Есть вот такие типы (условно):
public class SomeClass
{
readonly IEnumerable<SomeNestedStruct> structs;
SomeClass(Builder builder)
{
// checks skipped
structs = builder.structs;
}
public static Builder CreateBuilder() => new Builder();
⋮
struct SomeNestedStruct // об этом типе знать должны только `SomeClass` и `SomeClass.Builder`
{
⋮
}
public sealed class Builder
{
IEnumerable<SomeNestedStruct> structs; // проблемная строка
internal Builder() { ... }
public SomeClass Build() => new SomeClass(this);
⋮
}
}
Дело в том, что классу SomeClass нужно получить доступ к приватному полю structs класса SomeClass.Builder. Его можно сделать internal, но в таком случае internal придётся делать и SomeNestedStruct, а это уже нарушение инкапсуляции: «об этом типе знать должны только SomeClass и SomeClass.Builder».
Каким образом лучше всего разрешить данную ситуацию? Или сама такая ситуация и загон архитектуры в неё является ошибкой? Или мой упрёк в нарушении инкапсуляции не имеет значимого веса как такового?