Короткий ответ: это зависит
Длинный ответ: если вы B и C классы инкапсулируете данные и / или функциональность, которая может быть полезна вне класса A, и A является «единственным» клиентом B иC, пусть они будут инстанцируемыми независимо от A и установлены в A с помощью сеттеров, подобных setA/setB
.Таким образом, другие классы могут использовать B и C по любой причине.Вы также можете воспользоваться преимуществами наследования, когда экземпляры с расширенными функциональными возможностями вводятся в класс A во время выполнения (например, с помощью платформ Inversion of Control, как указано в JohnReeeves).
Если они имеют смысл только в контексте класса A,инкапсулировать функциональные возможности, которые непосредственно использует только A, скрыть их от внешнего мира и параметризовать с помощью методов / свойств класса A.Это дает вам свободу изменять реализацию B и C, чтобы ни один код снаружи не расстраивался.A является общедоступным интерфейсом, так сказать, B и C. являются внутренней реализацией.
И, как правило, чем больше вы можете скрыть от своей реализации, тем лучше, чтобы внешний мир знал только то, что ему необходимо знать.функционируйте должным образом.
Итак, подумайте о явной цели A, B и C, их отношениях друг с другом и с внешним миром и примите решение.