2013-02-21 3 views
1

рубинаПреобразование базового класса Подкласс в Рубине

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 в C++ там будет static_cast, reinterpret_cast, «convert» operator и т. д., как это сделать на ruby? (Есть ли ярлык), например

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

[2], как перезаписать каждый унаследовал значения члена данных 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

Это плохой ООП, если вы спросите меня. –

+1

какая часть плохая? : | заранее заранее – Kokizzu

+0

The downcasting часть. Мне еще предстоит увидеть действительную потребность в этом. –

ответ

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> 
Смежные вопросы