У меня есть абстрактный класс A и несколько его реализаций. Я ожидаю, что это будет развиваться со временем, добавляя больше реализаций.
У меня также есть интерфейс, который что-то делает в экземплярах вышеуказанной иерархии классов (например, печатает их).
Я хочу, чтобы реализации интерфейса предоставляли некоторые специальные функции для некоторых подклассов A и функциональность по умолчанию для остальных из них.
Надеюсь, этот пример прояснит ситуацию:
abstract class A { }
class B extends A { }
class C extends A { }
interface Processor {
public void process(A a);
}
class SimpleProcessor implements Processor {
//I want this to be called when argument is instance of A or C or any
//new class that will be added in the future
public void process(A a) {
//Line 14
System.out.println("Default processing");
}
//I want this to be called when argument is instance of B
public void process(B b) {
System.out.println("Special processing");
}
}
public class Runner {
public static void main(String[] args) {
B b = new B();
Processor p = new SimpleProcessor();
p.process(b);
}
}
В примере печатается «Обработка по умолчанию». Проблема состоит в том, что метод, который должен быть выполнен, выбирается на основе типа времени компиляции метода интерфейса. Есть ли способ (или шаблон проектирования), чтобы эта программа печатала «Специальную обработку», не добавляя в строке 14 список
if (a instance of B)
process( (B) a );
для каждого класса, который нуждается в специальной обработке?
Я посмотрел на шаблон посетитель , но это не кажется улучшением, потому что я не хочу «загрязнять» интерфейс процессора процессорами для каждого подкласса A, потому что больше подклассов Будет добавлено.
Другими словами, я хочу, чтобы реализации интерфейса:
- обеспечивает пользовательскую реализацию метода для определенных подклассов A
- обеспечивает реализацию по умолчанию для классов, которые будут добавлены в будущем
- избегайте перечисления всех классов в большом списке if-then-else
Спасибо !!