2013-02-21 37 views
1

子类在红宝石转换基类中的Ruby

class A 
    @x = 1 
    @y = 2 
    attr_accessor :x, :y 
end 

class B < A 
    @z = 3 
    attr_accessor :z 
end 

a = A.new 
b = B.new 

[1]将A的实例的(a)到B?而不会丢失任何A的成员值 在c + +会有static_cast,reinterpret_cast,“转换”运营商等等。如何在ruby上做到这一点? (是否有任何快捷方式),例如

b = a.convert_to B 
# b.x = 1 
# b.y = 2 
# b.z = 3 

[2]如何覆盖每个继承(b)中例如使用的值,如果有许多继承数据成员B的数据成员的值? (有没有内置的方法或快捷方式来做到这一点?)例如

a.x = 1 
a.y = 2 

b.x = 3 
b.y = 4 
b.z = 6 

b.overwrite_all_inherited_method_from a 
# b.x = 1 
# b.y = 2 
# b.z = 6 
+1

这是一些不好的OOP,如果你问我。 – 2013-02-21 10:11:08

+1

哪部分不好? :|预先感谢您 – Kokizzu 2013-02-21 10:13:31

+0

下转部分。我还没有看到对此的有效需求。 – 2013-02-21 10:15:26

回答

1

Smth那样?

class A 
    attr_accessor :x, :y 

    def copy other 
    other.instance_variables.each do |v| 
     instance_variable_set v, other.instance_variable_get(v) 
    end 
    end 
end 

class B < A 
    attr_accessor :z 
end 

a = A.new 
a.x = 1 
a.y = 2 

b = B.new 
b.z = 3 

puts a.inspect, b.inspect 
#<A:0x0000010127f3d8 @x=1, @y=2> 
#<B:0x0000010127f3b0 @z=3> 

b.copy a 

puts a.inspect, b.inspect 
#<A:0x0000010127f3d8 @x=1, @y=2> 
#<B:0x0000010127f3b0 @z=3, @x=1, @y=2>