我需要一个对象B,但是当我执行'B.GetByID()'
时我得到一个对象A.public class A
{
public A()
{
}
public static A GetSelf()
{
return new A();
}
public static A GetByID()
{
return GetSelf();
}
}
public class B extends A
{
public B()
{
super();
}
public static B GetSelf()
{
return new B();
}
}
B.GetByID(); //returns A, i need B
答案 0 :(得分:12)
您只能通过 在B GetByID()
中创建B
方法来执行此操作。虽然这有点难看......
基本上,您的B.GetByID()
来电将被解析为A.GetByID()
;编译代码中的任何内容都不会表明它原来是B.GetByID()
,并且GetSelf()
中对GetByID()
的调用无论如何都将被解析为A.GetSelf()
。
基本上,静态方法不允许以您希望的方式进行多态化。我建议你创建一个AFactory
和一个BFactory
子类,并使用 instance 方法以正常方式使用方法覆盖。
答案 1 :(得分:1)
您可以向GetByID
添加B
方法,如下所示:
public class B ... {
public static B GetByID()
{
return GetSelf();
}
}
答案 2 :(得分:0)
您的工厂方法(无论在哪个类中声明)都需要知道A
和B
两者,然后决定要实例化哪个类。如果调用者知道它需要B
,那么它无论如何都可以执行new B()
,因此无论如何工厂方法都没有值。