【问题标题】:How to initialise an instance other than the current class in Ruby?如何在 Ruby 中初始化当前类以外的实例?
【发布时间】:2013-04-01 22:42:53
【问题描述】:

我想根据初始参数初始化不同类的实例。例如,我希望Hello.new(true)Hello.new(false) 具有不同的行为。准确地说,我希望他们创建不同类的实例

我如何在 Ruby 中实现这一点?

class Name1
end

class Name2
end

class Hello
  def initialize(opts)
    if opts
      Name1.new
    else
      Name2.new
    end
  end
end

【问题讨论】:

  • 是Simone给出的答案,是你要找的那个吗?如果是这样,请接受它或向我们提供有关您需求的更具体信息。由于您的要求不明确。
  • 隐含的要求是Hello.new( nil )返回一个Name2类的对象,而Hello.new( some_non_nil_options )返回一个Name1类的对象。 Simone 的回答是有效地建议 不要 尝试以这种方式覆盖 new,而是使用不同的方法名称,以便更容易和更标准地返回可能在其中一个中的对象可能的课程。这是一个很好的答案 IMO,但如果由于某种原因使用的方法绝对必须是 Hello.new,则不符合要求

标签: ruby oop class proxy instance


【解决方案1】:

您所说的称为Factory 模式(至少,一个简单的版本)。可以手动拆分new进程调用allocateinitialize,但我不建议这样做。

主要原因是因为它完全违反直觉。你(几乎)永远不会找到这样的 Ruby 库。

相反,我建议您使用不同的方法。例如,#factory

class Name1
end

class Name2
end

class Hello
  def self.factory(opts)
    klass = if opts
      Name1
    else
      Name2
    end
    klass.new
  end
end

Hello.factory(...)

【讨论】:

  • 我没有得到if-else OP 块和你之间的区别。你能帮帮我吗?
  • 是一样的。我将类名作为变量返回,然后在其上调用 .new。主要区别是答案的关键,是我使用.factory 方法而不是更改.new
  • 好的。你的一个如何比 OP 更有益。只是为了了解我问的概念。由于这两个代码都产生了两个对象。OP 的一个是在创建Hello 对象时产生Name 对象。而您的代码通过方法执行此操作,稍后创建Hello 的对象。那么从逻辑上讲,你和 OP 的两个代码有什么区别?
  • @RubyLovely:OP 的代码不会返回来自new 的对象。相反,OP 获得了 Hello 类的空对象。这只是由于initialize 的工作方式。 Simone 的回答是关于如何将几乎相同的代码放入 Ruby 的类和对象模型的稍微不同的部分,以便它按预期工作,并根据许多 OO 编码人员将从 Ruby 和许多其他语言。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2021-05-11
  • 2021-08-12
  • 2017-10-23
相关资源
最近更新 更多