假设我有一个子类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,其中包含有关提取如何发生的信息,但是价值需要克隆。
我的另一个选择是尝试制作某种包装类而不是子类?
答案 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'