Шаблон проектирования Java для ограничения доступных методов для возвращаемого объекта - PullRequest
0 голосов
/ 01 февраля 2012

Я новый программист Java / OO. Я хотел бы создать метод (именуемый ниже myMethod), который возвращает один из n типов объектов на основе проверки входных параметров и состояния мира. Скажите здесь n == 2 для простоты: myMethod() может вернуть объект любого типа Foo или Bar.

Foo и Bar имеют различные методы для вызова, некоторые эксклюзивные, а некоторые общие, такие как:

ReturnType? myMethod(inputs) {
    if (/*examining state of world & inputs implies a Foo*/)
        return new Foo();
    return new Bar();
}
...

public class Foo {
    public Foo() {}
    public void x() {...} //common to Bar
    public void f() {...}
}
public class Bar {
    public Bar() {}
    public void x() {...} //common to Foo
    public void b() {...}
}

Какой шаблон проектирования я должен использовать для myMethod() и для классов Foo и Bar? Если тип возвращаемого мной метода является суперклассом (или агрегатом?) Foo и Bar или если Foo & Bar реализует какой-то общий интерфейс, то есть ли способ для клиентов, которые получают объекты из myMethod(), чтобы безопасно вызывать f() или b() на возвращенном объекте без необходимости использовать самоанализ или приведение объекта?

Или этот дизайн - анти-шаблон, и есть ли очевидное переписывание, которое я пропускаю? Спасибо.

Ответы [ 4 ]

1 голос
/ 01 февраля 2012

Нет шаблона - вы не можете сделать это, зная тип и кастинг.

Вы должны либо подтянуть эти методы к общему интерфейсу, либо к родительскому классу ИЛИ приведению. Там нет «шаблона», чтобы спасти вас - это волшебное мышление.

0 голосов
/ 01 февраля 2012

Похоже, то, что вы пытаетесь сделать, очень близко к анти паттерну.

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

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

0 голосов
/ 01 февраля 2012

Ну, в java вы можете сделать неявное обновление для интерфейса, но вы должны использовать явное downcasting, иначе ваш java не скомпилируется.

0 голосов
/ 01 февраля 2012

Мне кажется, что шаблон проектирования, который вы ищете, - это шаблон проектирования Factory , который довольно часто используется в парадигме ОО.Вы можете прочитать больше об этом шаблоне здесь .Я не совсем уверен, чего вы пытаетесь достичь, но я думаю, что этот шаблон проектирования, по крайней мере, стоит посмотреть.

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