2014-01-07 247 views
1

我想在ruby中使用類變量。但是類變量在整個層次結構中都會發生變化,因此對於此目標無用:Ruby靜態繼承

假設我有3個類,每個類都是繼承的,除了父類。

class A 
end 

class B < A 
end 

class C < B 
end 

我將如何修改或創建中間類的靜態變量,以便類A沒有它,但類C沒有。

B.num = 2 

A.num # undefined or nil 
C.num # 2 

我也應該指定A.num應該仍然能夠使用,而無需改變B.num或C.num,除非它繼承。

+0

爲什麼類變量「無用」?你的句子在邏輯上並不遵循。 – sawa

+0

@sawa我不相信我的句子沒有流動。類B上的類變量也會更改類A上的類變量。它會改變父母和孩子。請查看此答案:http://stackoverflow.com/questions/1251352/ruby-inherit-code-that-works-with-class-variables?answertab=votes#tab-top –

+0

您似乎沒有正確理解我的評論。我提到,類變量在層次結構中共享的事實並不導致您得出類變量無用的結論。我要求你聲稱類變量是無用的。 – sawa

回答

3

編輯自OP改變的問題

使用一個類的實例變量AB

class A 
    singleton_class.class_eval{attr_accessor :num} 
end 

class B < A 
    singleton_class.class_eval{attr_accessor :num} 
end 

class C < B 
    def self.num; superclass.num end 
    def self.num= v; superclass.num = v end 
end 

B.num = 2 
A.num # => nil 
C.num # => 2 
+0

添加到Sawa的答案:如果你以後決定B不應該重寫num,那麼你必須複製'self的定義.nu​​m「從C轉換爲B.每個具有num或代表其超類的類都必須有幾行代碼。 –