Номер два - это путь.(И нет, я не пытаюсь быть смешным.)
... передать ImportantInfo
в качестве аргумента, когда метод родительского экземпляра SomeCoolStringBufMethod()
вызывается из родительского объекта.
Методы - это то, как классы взаимодействуют друг с другом.Наличие ссылки на другой объект - это всего лишь средство для возможности вызывать его методы и получать доступ к его свойствам.
Есть веские причины, по которым мы обычно не создаем классы с циклическими ссылками между ними.Представьте себе, например, Text.StringBuilder
.Что если у него есть ссылка на класс, который его создал, независимо от того, как он получил эту ссылку - через конструктор, отражение или что-то еще.
Что будет StringBuilder
делать с этой ссылкой?Чтобы сделать что-либо с этим объектом, кроме вызова ToString()
, ему нужно знать тип этого объекта.Но если ему известен тип этого объекта, то это означает, что StringBuilder
работает, только если у него есть ссылка на этот тип объекта.Это означает, что класс, который зависит от StringBuilder
и StringBuilder
, может использоваться только в сочетании друг с другом.
Возвращаясь к вашему классу: что нужно вашему детскому классу?Bar
нужен Foo
?Это нужно string
.Любой класс, который вызывает его метод, может дать ему string
.Так зачем соединять это с другим классом?Однажды вам или кому-то еще нужно будет заставить Bar
работать без Foo
, и тогда у вас будет узел, который можно развязать.
Если Bar
зависит от Foo
, чтобы получить его ImportantProperty
, что также затрудняет юнит-тестирование.Вам нужно будет создать Foo
, а затем создать Bar
, чтобы Bar
мог получить ImportantProperty
из Foo
.Если это зависит от string
, то это легко проверить.Тест должен только создать string
.
. В вашем примере передача ImportantProperty
конструктору Bar
не имеет смысла, потому что это свойство записи Foo
.Это означает, что Foo
может изменить его, и тогда все Bar
будут иметь другое свойство, если вы не создадите все новые.(Возможно, тот факт, что ImportantProperty
может измениться, является причиной, по которой вы хотите вернуть ссылку на родителя, но передача string
вызову метода все еще решает эту проблему.)
Вы почти наверняка можете сделатьэта работа без ребенка, содержащая собственную ссылку на родителя.Если он должен иметь эту ссылку, то имеет смысл передать эту ссылку в конструктор дочернего элемента.