Inheritable attributes in ruby classes
-
05-10-2019 - |
Question
Greets to all! I want to describe each kind of product by a class:
# 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]
So, how to implement this? I spent 3 days on it but got no working code(
Solution
EDIT: Okay, try this:
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]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow