我是一名新的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()
,而无需使用对象内省或铸造?
或者这个设计是一个反模式,是否有一个明显的重写,我错过了?感谢。
答案 0 :(得分:1)
没有模式 - 你知道类型和铸造你不能做到这一点。
您必须将这些方法拉到公共接口或父类或转换。没有“模式”可以拯救你 - 这是一种神奇的想法。
答案 1 :(得分:0)
在我看来,您正在寻找的设计模式是 Factory 设计模式,这在OO范例中非常常用。您可以阅读有关此模式的更多信息here。我不完全确定你想要实现的目标,但我认为这种设计模式至少值得关注。
答案 2 :(得分:0)
在java中,您可以对接口进行隐式向上转换,但必须使用显式向下转换,否则您的java将无法编译。
答案 3 :(得分:0)
看起来你要做的就是非常接近反模式。
由于返回的对象类型取决于“世界状态”,您是否期望调用方法检查返回对象的确切类型,并根据类型行为不同?
我认为您需要坐下来,并尝试解释此设计的用例,然后我们可以帮助您找到更好的解决方案。