Рассмотрим следующую кодовую комбинацию:
// Each foo keeps a reference to its manager
class Foo
{
private FooManager m_manager;
}
// Manager keeps a list of all foos
class FooManager
{
private List<Foo> m_foos;
}
Проблема: нет способа создать новый Foo и обновить как список m_foos в FooManager, так и ссылку m_manager в новом экземпляре Foo без публичного раскрытия некоторых привилегированных лиц (и существует риск того, что кто-то рассмерит список с фактическими Foos) ,
например. можно реализовать конструктор Foo (менеджер FooManager) в Foo. Он может установить ссылку на m_manager, но не имеет доступа к списку m_foos. Или вы можете реализовать метод CreateFoo () в менеджере. Он может получить доступ к списку m_foos, но не может установить m_manager в Foo.
В C ++ можно было бы объявить FooManager другом Foo, чтобы выразить намерение проекта, но это невозможно в C #. Я также знаю, что мог бы сделать Foo внутренним классом FooManager для получения доступа, но это тоже не решение (что, если Foo может принадлежать более чем одному классу менеджера?)
Btw. Я знаю о «внутреннем» доступе в .NET, но он требует, чтобы Foo и FooManager жили отдельно в отдельной сборке, что недопустимо.
Есть ли какие-либо обходные пути для этого без обнародования личных вещей?