2014-01-07 250 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或代表其超类的类都必须有几行代码。 –