Я думаю, что у вас есть неразрешимая проблема.Я так понимаю, вы говорите:
- Вы написали несколько
AbstractProcessor
подклассов. - Все они делают разные вещи и дают разные результаты.
- Вы хотитеотноситься к ним все однородно, как к экземплярам
AbstractProcessor
.
Но вы не можете относиться к ним как к экземплярам одного и того же класса AbstractProcessor
, если все они дают разные результаты.Вы должны знать, какой тип процессора у вас есть, чтобы интерпретировать результаты.
У вас есть два варианта.Первый вариант - унифицировать результаты.Например, у вас может быть интерфейс с именем ResultHandler
, например:
interface ResultHandler {
void handleSumResult(int result);
void handleConcatResult(String result);
void handleSomeOtherProcessorResult(Whatever result);
}
Передача экземпляра ResultHandler
(либо в процессе построения, либо в отдельном методе handleResult
), затем (в каждомпроцессор) вызвать метод ResultHandler
, соответствующий этому типу процессора.Если у вас есть несколько разных процессоров, которые каким-то образом генерируют суммы, по крайней мере, все они могут вызывать один и тот же handleSumResult
API, и вам не нужно никуда делать instanceof
.
Другая стратегия состоит в том, чтобы простооткажитесь от вашей попытки одинаково относиться ко всем процессорам.Я думаю, что это может быть лучшим вариантом.Ваш код, очевидно, знает, какой процессор ему нужно использовать, поэтому просто создайте его экземпляр, используйте его и соберите результаты из любого API, который вы определили.Если есть какая-то причина, по которой вам нужно обрабатывать процессоры однородно (например, класс процессора указан пользователем, может быть, в файле конфигурации), то переместите эту абстракцию на один уровень вверх и вместо этого попросите пользователя указать класс, которому принадлежит весьПроцесс обработки данных и сбора результатов.Вместо указания MyProcessor,
использование указывает MySomethingElse
, а затем MySomethingElse
создает экземпляр MyProcessor
и обрабатывает результаты.