如何在初始化父类时返回子类的新实例?

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)

是否可以实际初始化并返回初始化BC初始化的实例A?即my_obj = A.new(param)会导致my_obj作为类的实例BC依赖于价值param,这被签入A.initialize(param).

在我的用例中,它在运行时只知道使用哪个子类(BC)和父类(A)基本上从未真正使用过.我想这可能是移动决定是否逻辑一个好主意,B或者C到他们的共同祖先.

如果这是不可能的(或不好的风格),我应该在哪里检查param和决定初始化哪个类?

Com*_*ubh 11

你在这里打破了一个基本的OO原则 - 类应该对它们的子类一无所知.当然,有时原则应该被打破,但没有明显的理由在这里做.

一个更好的解决方案是将实例化逻辑转换为单独类中的工厂方法.工厂方法采用与上面的A的初始化程序相同的参数,并返回相应类的实例.