我正在使用一个非常简单的工厂类来创建一些初始化我的对象:
public class MyFactory {
public static Superclass createObject(String type) {
Superclass myObject = null;
if (type.equals("type1")) {
myObject = new Subclass();
myObject.setParam("val1");
}
return myObject;
}
}
不那么复杂:-)没有通用代码等,只有这样。然而,如果我以这种方式使用我的工厂,我会在Eclipse中遇到类型不匹配错误:
Subclass myObj = MyFactory.createObject("type1");
错误说它不能从Superclass转换为Subclass,但是我看的每个地方(Heads First Design Patterns等)我都可以这样看:返回类型为创建的子类的超类...那么为什么我得到这个错误:-)?谢谢!
答案 0 :(得分:2)
错误说它无法从超类转换为子类
没错。这与您在Number
中存储Integer
的原因相同(Number
实际上可能是Double
!)
如果您知道从Subclass
返回ProbeFactory.createProbe("type1")
,那么您可以像这样投出:
Subclass myObj = (Subclass) ProbeFactory.createProbe("type1");
如果可能,应避免向下铸造。您可以设计它以便使用
Superclass myObj = ProbeFactory.createProbe("type1");
或者您可以尝试创建工厂的类型安全版本:
Subclass myObj = ProbeFactory.createSubProbe("type1");
答案 1 :(得分:1)
您可以明确地将返回值强制转换为Subclass
,一旦工厂返回另一个Subclass
Superclass
,它将失败并在运行时抛出异常。 因此,不要这样做。
更合适的方法是将myObj
声明为类型Superclass
,并让界面包含您需要的方法。如果您需要知道返回的确切子类型,使用工厂模式有点毫无意义。
答案 2 :(得分:0)
反过来说。如果你得到SubClass
,你可以将它分配给SuperClass
变量(如果我们假设SubClass扩展了SuperClass)。
答案 3 :(得分:0)
由于该方法返回Superclass,您无法直接将其分配给子类。
你需要使用它或输入。
Superclass myObj = ProbeFactory.createProbe("type1");
Subclass myObj = (Subclass) ProbeFactory.createProbe("type1");
答案 4 :(得分:0)
通常你想要同样对待同一工厂的对象,这就是为什么创建Superclass以具有所有常见行为的原因。如果你真的想要使用它们特定于类,那么,是的,你应该进行强制转换。但我觉得这样会破坏抽象工厂的目的。
如果您想要特定产品或产品组,则在将工厂分类并从子工厂接收时