2011-05-16 84 views
2

所以这就是我想做的事:类继承轨

class A 
    ATTRS = [] 

    def list_attrs 
    puts ATTRS.inspect 
    end 
end 

class B < A 
    ATTRS = [1,2] 
end 

a = A.new 
b = B.new 
a.list_attrs 
b.list_attrs 

我想创建一个基类与类的ATTRS属性起着方法。在每个继承类会有不同的ATTRS阵列

因此,当我打电话a.list_attrs应该打印一个空数组,如果我叫b.attrs应该把[1,2]

这怎么能在ruby/ruby​​上完成?

回答

2

它通常与方法进行:

class A 
    def attrs 
    [] 
    end 

    def list_attrs 
    puts attrs.inspect 
    end 
end 

class B < A 
    def attrs 
    [1,2] 
    end 
end 
2

MODF的答案工程...点击这里与变量的另一种方式。 (ATTRS是一个常数在你的例子)

class A 
    def initialize 
    @attributes = [] 
    end 

    def list_attrs 
    puts @attributes.inspect 
    end 
end 

class B < A 
    def initialize 
    @attributes = [1,2] 
    end 
end 
+0

我要说的是,在子类访问实例变量是不好的做法(封装差)。尽管你可以使用属性阅读器/编写器,但是你仍然必须在你的'initialize'方法中调用'super'(除了这个例子中的小例子),并且按照正确的顺序! – molf 2011-05-16 13:44:56

+0

@modf:倾向于同意你;我认为继承本身被过度使用,在大多数情况下应该避免 – 2011-05-16 14:08:41

1

我不认为这是建立在同一个阵列的每个方法被调用时,一个好主意。使用类实例变量更自然。

class A 
    def list_attrs; p self.class.attrs end 
end 
class << A 
    attr_accessor :attrs 
end 

class A 
    @attrs = [] 
end 
class B < A 
    @attrs = [1, 2] 
end 
A.new.list_attrs # => [] 
B.new.list_attrs # => [1, 2] 

您也可以使用常量沿问题建议行:

class A 
    def list_attrs; p self.class.const_get :ATTRS end 
    ATTRS = [] 
end 
class B < A 
    ATTRS = [1, 2] 
end 
A.new.list_attrs # => [] 
B.new.list_attrs # => [1, 2]