Строго говоря, составной шаблон согласно Gamma, Helm et.al. говорит о манипулировании дочерними элементами через интерфейс (в вашем случае, Food), который может привести вас к реализации, в которой любое количество дочерних элементов может быть добавлено (или удалено) к любому узлу в составномдерево.Типичная реализация может включать в себя абстрактный суперкласс, который будет реализовывать дочернее управление (добавление, удаление и т. Д.), А затем из этого будут выведены конкретные подтипы.Примерно так:
Есть варианты дизайна, которые я здесь делаю, но суть правильная.
Однако в более широком смысле состав не требует реализации составного шаблона .Использование композиции просто прекрасно без нее, на самом деле есть принцип, также обсуждаемый Gamma, Helm et.al. , который говорит о предпочтении композиции перед наследованием и не имеет ничего общего с составным шаблоном как таковым.
Заманчиво использовать наследование как удобный способ повторного использования кода в вашей программе, но это действительно так.не в том, что такое наследование, поэтому составление предпочтительнее как способ защиты от неправильного использования наследования и создания в результате неуправляемого кода.Боюсь, это может быть связано с тем, что вы используете интерфейс Food для доступа к переменной члена Calories.Если вы не обобщаете свой дизайн, то есть хотите быть конкретным относительно того, что PeanutButterAndJellySandwich содержит во время разработки (в структуре вашего кода), то вам, вероятно, следует объявить переменные внутри PeanutButterAndJellySandwich с использованием их конкретных типов.Это Food , нет никаких сомнений, но рассмотрим, что PeanutButterAndJellySandwich собирается делать с переменными-членами, которые все объявлены как Food ?Зачем не использовать массив Food?