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

标签 ruby oop class inheritance

给定一个类层次结构如下:

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) 中检查.

在我的用例中,它只在运行时知道要使用哪个子类(BC),而父类(A)基本上从未真正使用过。 我认为移动决定是否 B 的逻辑可能是个好主意。或 C进入他们共同的祖先。

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

最佳答案

您在这里违反了一个基本的 OO 原则——类不应该知道它们的子类。当然,有时原则应该被打破,但这里没有明显的理由这样做。

更好的解决方案是将实例化逻辑转移到单独类中的工厂方法。工厂方法采用与上面 A 的初始值设定项相同的参数,并返回相应类的实例。

关于ruby - 如何在初始化父类时返回子类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11074175/

相关文章:

ruby - bundle 安装从错误的目录运行

javascript - 根据 Rails 中的第一个选择列表值更改第二个选择列表

ruby - Popen 获取新运行进程的 pid

c++ - 类中的 Fstream 初始化 - 检查文件是否打开

c++ - C++ 中对 class::function 的 undefined reference

ruby - capybara 找不到 javascript

JavaScript 访问父对象属性

php - 对某个 PHP 类的每个实例化对象执行一个方法

来自类的c++第二个函数无法访问第一个

symfony - 如何修复Symfony中 Composer 更新后找不到的类?