Проблема - результат возврата. Это отличается для каждого звонка.
Это, кажется, неправильное использование шаблона Composite. Основная идея Composite заключается в том, что вам все равно, работаете ли вы с Composite или с его компонентами, потому что они логически взаимозаменяемы.
Для иллюстрации скажем, у вас есть абстракция
interface IPainter
{
double PaintedArea(double hours);
}
У вас есть куча реализаций -
class DiligentPainter : IPainter
{
double PaintedArea(double hours) => hours * 100;
}
class LazyPainter : IPainter
{
double PaintedArea(double hours) => hours * 20;
}
И вот ключевая часть - если подумать, вашим клиентам может быть все равно, будут ли они нанимать одного художника или команду. Их волнует только то, что все их стены покрашены.
Так что вы можете сделать композит PainterCrew
и заставить его работать как один художник -
class PainterCrew : IPainter
{
readonly IEnumerable<IPainter> painters;
PainterCrew(IEnumerable<IPainter> painters)
{
this.painters = painters;
}
double PaintedArea(double hours)
{
return this.painters.Sum(p => p.PaintedArea(hours));
}
}
Видите, вы не просто возвращаете набор отдельных результатов - вы агрегируете их осмысленным образом, чтобы со стороны вызывающей стороны не имело значения, работают ли они с Composite или с одной сущностью.