2010-09-24 54 views
3

迎接所有人! 我想通過一個類來描述了每一種產品:Ruby類中的可繼承屬性

# Base product class 
class BaseProduct 
    prop :name, :price # Common properties for all inheritable products 
end 

class Cellphone < BaseProduct 
    prop :imei # Concrete property for this product 
end 

class Auto < BaseProduct 
    prop :max_speed, :color # Concrete properties for this product 
end 

c = Cellphone.new 
c.prop_names # => [:name, :price, :imei] 

a = Auto.new 
c.prop_names # => [:name, :price, :max_speed, :color] 

那麼,如何實現這一點?我花了3天,但沒有得到工作的代碼(

回答

3

編輯:好吧,試試這個:

class BaseProduct 

    class << self 
    def prop(*names) 
     attr_accessor *names 
     local_prop_names.push(*names) 
    end 

    def local_prop_names 
     @local_prop_names ||= [] 
    end 

    def prop_names 
     if self == BaseProduct 
     local_prop_names 
     else 
     superclass.prop_names + local_prop_names 
     end 
    end 
    end 

    def prop_names 
    class << self; prop_names; end 
    end 
end 

class BaseProduct 
    prop :name 
end 

class Aero < BaseProduct 
    prop :tricksy 
end 

class Heart < Aero 
    prop :tiger 
end 

Aero.new.prop_names #=> [:name, :tricksy] 
Heart.new.prop_names #=> [:name, :tricksy, :tiger]