Проблема инкапсуляции и вложенных классов

Есть вот такие типы (условно):

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».

Каким образом лучше всего разрешить данную ситуацию? Или сама такая ситуация и загон архитектуры в неё является ошибкой? Или мой упрёк в нарушении инкапсуляции не имеет значимого веса как такового?


Ответы (0 шт):