Как перегрузить метод для обработки подклассов параметров в Java? - PullRequest
1 голос
/ 13 февраля 2012

У меня проблема с дизайном, которую я не могу понять, как ее решить. В основном я использую посетителя для обновления экземпляров определенного класса. Я хочу иметь возможность реализовывать различные виды обновлений в будущем, как расширение моего класса обновлений. Я также хочу иметь возможность обновлять различные виды объектов (все они получены из базового класса). Итак, у меня есть:

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) отправить сообщение с его перегрузками?

Спасибо

1 Ответ

4 голосов
/ 13 февраля 2012

Вы должны переопределить метод accept

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 void accept(Update u) 
    {
        u.visit(this);
    }
}

public class C extends A { 
    public void accept(Update u) 
    {
        u.visit(this);
    }
}
...