2016-03-01 70 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