Шаблоны, чтобы компенсировать отсутствие поиска метода во время выполнения на основе полиморфных аргументов в Java? - PullRequest
4 голосов
/ 03 ноября 2010

Кажется, что Java не может выбрать наиболее подходящую реализацию метода, основанную на типе времени выполнения аргумента, как задокументировано здесь . Повторим пример:

class Superclass {}
class Subclass extends Superclass {}
class Test {
    public void aMethod(Superclass s) {...}
    public void aMethod(Subclass s) {...}
}

Какой метод класса Test выполняется, определяется на основе типа ссылки, а не типа экземпляра. Опять же, на основе связанных примеров:

Test aTest = new Test();
Superclass aSuper = new Subclass();
test.aMethod(aSuper);

Выполняется aMethod(Superclass s), а не aMethod(Subclass s).

Я пытался создать вариант шаблона слушателя, где слушатели «подключаются» через интерфейс, а у слушателей есть методы, определенные для подклассов интерфейсов.

В качестве быстрого примера того, что я имею в виду, скажем, я создаю будильник, в который можно включить функциональность.

Реализация вышеупомянутого, которую я имел в виду, выглядела бы как интерфейс Event с подклассом WakeUpEvent и интерфейсом EventListener, требующим реализации handle(Event evt).

Я надеялся создать класс, реализующий no-op handle(Event evt) с конкретным handle(WakeUpEvent evt), если слушатель хотел иметь дело с этим типом события.

Конечно, этот подход не будет работать как есть - очевидным решением является время выполнения instanceof проверок - юк.

Существуют ли какие-либо модели или подходы, которые я могу использовать, чтобы получить желаемое поведение?

Ответы [ 4 ]

7 голосов
/ 03 ноября 2010

Шаблон посетителя - то, что вам нужно

4 голосов
/ 03 ноября 2010

Это ситуации, когда я думаю о посетителе или шаблоне двойной отправки.

0 голосов
/ 03 ноября 2010

Это не прямой ответ, а скорее подсказка для понимания проблемы.

То, что вы описываете, представляет собой запутанную комбинацию перегрузки методов (используемой в классе Test) и переопределения (используется для описания того, чего вы хотите достичь путем реализации EventListener, но затем перегрузки handle).

Причиной такого поведения является то, что перегрузка приводит к решению во время компиляции, какой метод будет вызываться. Таким образом, если вы используете перегрузку, неплохо иметь взаимно несовместимые типы аргументов, чтобы избежать такой путаницы.

0 голосов
/ 03 ноября 2010

Как уже отмечали другие, вы можете использовать шаблон Visitor.

Однако я бы посоветовал вам подумать об альтернативном подходе, так как все это кажется мне запахом дизайна.

Разве aMethod не должен быть определен в SuperClass, а не в Test? Затем вы можете переопределить aMethod в подклассе, и во время выполнения будет вызвана правильная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...