Я новый программист 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()
на возвращенном объекте без необходимости использовать самоанализ или приведение объекта?
Или этот дизайн - анти-шаблон, и есть ли очевидное переписывание, которое я пропускаю? Спасибо.