如何在Ruby中克隆超类对象的属性?

时间:2014-06-27 21:27:39

标签: ruby subclass

假设我有一个子类Sub到Super类,而一个Super实例叫super。如何创建一个新的Sub实例,它将自动克隆所有超级属性(并包含其他Sub属性)?或者,我可以创建一个新的Super实例,然后将其类更改为Sub?

更多细节:

class Value<串

attr_accessor ...fields...

def initialize(name, ...fields...)
    ...sets fields...
    super(name)
end

def ...methods...
end

类Extracted_Value

attr_accessor ...more fields...

def initialize(???)
    ???
end

我有很多不同的Value实例,对于每一个我都可以成功地从一个话语中提取,这意味着要创建一个新的Extracted_Value,其中包含有关提取如何发生的信息,但是价值需要克隆。

我的另一个选择是尝试制作某种包装类而不是子类?

2 个答案:

答案 0 :(得分:1)

class A
 attr_accessor :a1, :a2

 def initialize param1, param2  
   @a1 = param1
   @a2 = param2
 end  
end

class B < A 
  attr_accessor :b1
end

当您实例化B类时,您可以从A(超级)类调用a1和a2,也可以调用b1。您可以在子类的初始化方法中组合您要设置的参数等...

b = B.new "foo", 3
puts b.a1 # "foo"
puts b.a2 # 3

希望这是你想要的?

答案 1 :(得分:1)

你正在危险地走向类变量土地,以及你在多个对象实例之间共享变量的所有问题。这几乎总是坏消息。

如果您有两个具有相同属性但属性值不同的对象,那么这些对象应该是定义属性的同一个类的两个实例,而不是两个单独的类。

您应该克隆当前实例以获取该类的新实例,而不是尝试生成另一个类的实例。

因此答案应该是:

sub = Sub.new 'foo', 3
sub_two = sub.clone
puts sub_two.a1 # 'foo'

关键是通过使用clone,新实例只是将属性复制到新实例,但不会在两个对象之间共享属性。所以你可以这样做:

sub.a1 = 'bar'
puts sub_two.a1 # 'foo'
puts sub.a1     # 'bar'