给定一个类层次结构如下:
class A
def initialize(param)
if param == 1 then
#initialize and return instance of B
else
#initialize and return instance of C
end
end
end
class B < A
end
class C < A
end
是否可以实际初始化并返回 B
的实例?或 C
初始化时A
? IE。 my_obj = A.new(param)
会导致 my_obj
作为类 B
的一个实例或 C
取决于 param
的值, 在 A.initialize(param)
中检查.
在我的用例中,它只在运行时知道要使用哪个子类(B
或 C
),而父类(A
)基本上从未真正使用过。
我认为移动决定是否 B
的逻辑可能是个好主意。或 C
进入他们共同的祖先。
如果这不可能(或糟糕的风格),我应该在哪里检查 param
以及决定初始化哪个类?
最佳答案
您在这里违反了一个基本的 OO 原则——类不应该知道它们的子类。当然,有时原则应该被打破,但这里没有明显的理由这样做。
更好的解决方案是将实例化逻辑转移到单独类中的工厂方法。工厂方法采用与上面 A 的初始值设定项相同的参数,并返回相应类的实例。
关于ruby - 如何在初始化父类时返回子类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11074175/