Tor*_*örn 10 ruby oop inheritance class
给定一个类层次结构如下:
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
Run Code Online (Sandbox Code Playgroud)
是否可以实际初始化并返回初始化B或C初始化的实例A?即my_obj = A.new(param)会导致my_obj作为类的实例B或C依赖于价值param,这被签入A.initialize(param).
在我的用例中,它在运行时只知道使用哪个子类(B或C)和父类(A)基本上从未真正使用过.我想这可能是移动决定是否逻辑一个好主意,B或者C到他们的共同祖先.
如果这是不可能的(或不好的风格),我应该在哪里检查param和决定初始化哪个类?
Com*_*ubh 11
你在这里打破了一个基本的OO原则 - 类应该对它们的子类一无所知.当然,有时原则应该被打破,但没有明显的理由在这里做.
一个更好的解决方案是将实例化逻辑转换为单独类中的工厂方法.工厂方法采用与上面的A的初始化程序相同的参数,并返回相应类的实例.