2012-09-05 121 views
0

我想了解繼承:當我期待4Ruby和繼承

moe = Car.new 
larry = StretchLimo.new 

當我做moe.wheel,我得到6,:

class Car 
    @@wheels = 4 
    def wheel 
    @@wheels 
    end 
end 

class StretchLimo < Car 
    @@wheels = 6 
    def whee 
    @@wheels 
    end 
    def turn_on_television 
    end 
end 

我實例,像這樣一些對象。

我遵循的Ruby教程說它應該是4Larry.whee顯然應該返回6

順便說一下,我添加了「wheel」和「whee」函數,所以我可以看到值。任何人都可以解釋這裏有什麼問題?

+0

歡迎使用stackoverflow。請正確格式化您的代碼。 –

+0

ruby​​中的類變量很奇怪和令人困惑。最好不要使用它們。 – levinalex

回答

0

@@是一個類變量,因此它是從給定類和所有派生類實例化的所有對象之間共享的。由於Ruby解釋,直到你實例化一個StretchLimo對象,它不應該看任何StretchLimo碼的,所以如果你做了以下內容:

moe = Car.new 
moe.wheel # should give 4 
larry = StretchLimo.new 
moe.wheel # should give 6 

因爲當StretchLimo得到解釋它更新@@wheels類變量是6。另一方面,如果你聲明只有一個「@」(@wheels)的「輪子」,它將是一個特定於對象本身的實例變量,並且您將獲得您的首選行爲。

+0

感謝您的提示! –

+0

這實際上並不正確。 'moe.wheel'在第二行給出6。嘗試一下。 – levinalex

+0

取決於目錄結構和解釋方式。如果兩個類都在同一個文件中定義並從那裏加載,我確實得到了moe.wheel - > 6,但是如果我強制解釋器按順序加載這些類,情況並非如此。無論如何,首選方法是使用實​​例變量 –

1

Ruby中的類變量是strangeconfusing

來實現你想要的東西的習慣的方法是這樣的:

class Car 
    def wheels 
    4 
    end 
end 

class StretchLimo < Car 
    def wheels 
    6 
    end 
end 

Car.new.wheels #=> 4 
StretchLimo.new.wheels #=> 6 

請告訴我發生的事情是,類變量是類的所有實例之間共享。因爲StrechLimoCar的子類,所以StrechLimo的實例也可以看到這個變量。

+0

這幾乎肯定不是首選方法...請參閱http://stackoverflow.com/questions/2441524/closest-ruby-representation-of-a-private-static-final -and公共靜態決賽 –