У меня проблема с дизайном, которую я не могу понять, как ее решить. В основном я использую посетителя для обновления экземпляров определенного класса. Я хочу иметь возможность реализовывать различные виды обновлений в будущем, как расширение моего класса обновлений. Я также хочу иметь возможность обновлять различные виды объектов (все они получены из базового класса). Итак, у меня есть:
public class Update
{
public void visit(A obj) { /* generic */ }
public void visit(B obj) { /* specific for B */ }
public void visit(C obj) { /* specific for C */ }
}
public class A
{
public void accept(Update u)
{
u.visit(this);
}
}
public class B extends A { /* ... */ }
public class C extends A { /* ... */ }
У меня есть экземпляры в List<A>
, и я хочу применить самое конкретное обновление для каждого объекта. Однако, когда я пытаюсь применить Обновление к одному из элементов списка, я всегда получаю вызов visit(A)
вместо более конкретных. Я думаю, это потому, что это List<A>
, а не List<B>
или List<C>
, но я ожидаю, что полиморфизм позаботится об этом. Я не могу просто удалить оператор visit(A)
, потому что иногда имеет смысл не делать различий между C и B. Есть ли у вас какие-либо идеи о том, как решить эту проблему, не заставив visit(A)
отправить сообщение с его перегрузками?
Спасибо