2016-03-01 81 views
1

实例变量我知道,实例变量都无关,与遗传:继承和红宝石

class A 

    def initialize 
    @x = 2 
    end 

end 

class B < A 

    def puts_x 
    puts @x 
    end 

    def x=(value) 
    @x = value 
    end 

end 

b = B.new 
b.puts_x 
b.x=3 
b.puts_x 

此输出:

2 
3 

这里,类从AB继承和@x在类B与继承无关。

但输出是2。我想了解它。

的“Ruby Inheritance”页说:

由于实例变量无关与继承,它 遵循由子类使用的实例变量不能“影子” 实例在超变量类。如果一个子类使用一个 实例变量与其一个 祖先使用的变量具有相同的名称,它将覆盖其祖先变量的值。

我也想要这个的任何例子。

+0

在类'B',您创建了一个setter方法'X =(值)',因为你已经继承类'A'了'initialize'方法和最初设定的实例变量'@x = 2',当你调用'bx = 3'时,你调用setter方法来改变那个实例变量的值。所以现在'@x = 3'就是那个'b'的实例。 –

+1

*“据说......”* - 请包括一个来源。 – Stefan

+0

你可以参考http://rubylearning.com/satishtalim/ruby_inheritance.html – Messi

回答

7

BA继承initialize

创建对象时,调用initialize。因此,即使对B类别的对象,您也可以将@x设置为2

我认为,这些句子你引用是指这样的情景:

class A 
    def initialize 
    @x = 42 
    end 
end 

class B < A 
    def initialize 
    @x = 23 
    end 
end 

h = B.new 

现在,h只有一个变量@x与价值23实例。它不像有一个@xB和一个A。你可以在这里看到:

class A 
    def initialize 
    @x = 42 
    end 

    def set_x_from_a 
    @x = 12 
    end 

    def print_x_from_a 
    puts @x 
    end 
end 

class B < A 
    def initialize 
    @x = 23 
    end 

    def set_x_from_b 
    @x = 9 
    end 

    def print_x_from_b 
    puts @x 
    end 
end 

h = B.new 
h.print_x_from_a   # => 23 
h.print_x_from_b   # => 23 
h.set_x_from_a 
h.print_x_from_b   # => 12 
h.set_x_from_b 
h.print_x_from_a   # => 9 
+0

Thanx作为你的回复。你的解释不是该子类改变其祖先的价值。我认为超类改变了它的子类的价值。你可以参考http://rubylearning.com/satishtalim/ruby_inheritance.html – Messi

+0

@Messi:你是对的。但仍然... **对象**中只有一个“@ x”,无论您使用哪种类别的方法。 –

+0

但是'h'仍然是子类的实例,'@ x'是子类的实例变量。本书说改变子类的实例变量的值会覆盖超类的值。在你的超类的实例变量说明? – Messi