イメージ
module Parent
module MethodList
A = 1
end
class Hoge
# ...
end
end
module Child
module MethodList
B = 10
end
class Hoge < Parent::Hoge
define_method_from_list MethodList
end
end
Hoge.a # => 1
Hoge.b # => 10
特異クラスを利用することで解決することが出来る。
ポイントは以下。
- クラスメソッドは特異クラスのインスタンスメソッドとして定義される
-
define_method
はインスタンスメソッドを定義する
つまり、
-
Parent::Hoge
は特異クラスの特異クラスでdefine_method_from_list
を定義する- メソッド
define_method_from_list
はParent::Hoge
の特異クラスのクラスメソッドになる
- メソッド
-
Parent::Hoge
の特異クラスでdefine_method_from_list
を実行する-
Parent::Hoge
の特異クラスにインスタンスメソッドが生成される - メソッド
a
はParent::Hoge
のクラスメソッドになる
-
-
Child::Hoge
はParent::Hoge
を継承し、同じく特異クラスでdefine_method_from_list
を実行する
とすれば良い。
module Parent
module MethodList
A = 1
end
class Hoge
class << self
class << self
def define_method_from_list(list)
list.constants.each do |elm|
define_method(elm.downcase) do
list.const_get(elm)
end
end
end
end
define_method_from_list MethodList
end
end
end
module Child
module MethodList
B = 10
end
class Hoge < Parent::Hoge
class << self
define_method_from_list MethodList
end
end
end
p Parent::Hoge.a # => 1
p Parent::Hoge.b # => undefined method `b' for Parent::Hoge:Class (NoMethodError)
p Child::Hoge.a # => 1
p Child::Hoge.b # => 10