Рассмотрим следующий шаблон кода:
// 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.
В С++ можно было бы объявить FooManager другом Foo, чтобы выразить намерение дизайна, но это невозможно в С#. Я также знаю, что я могу сделать Foo внутренним классом FooManager, чтобы получить доступ, но это тоже не решение (что, если Foo может принадлежать более чем одному классу менеджера?)
Btw. Я знаю о "внутреннем" доступе в .NET, но он требует, чтобы Foo и FooManager живут самостоятельно в отдельной сборке, что неприемлемо.
Любые обходные пути для этого, не публикуя публичные материалы?