2010-08-15 1 views
2

Есть ли способ узнать, был ли метод переопределен подклассом программным путем? Что-то, что работает следующим образом:Как узнать, где в иерархии классов был определен метод и переопределен в Ruby?

class BaseModel 
    def create 
    puts "superclass" 
    end 
end 

class SomeModel < BaseModel 
    def create 
    puts "subclass" 
    end 
end 

puts SomeModel.overridden_instance_methods #=> [:create] 

Любые идеи?

ответ

4
SomeModel.instance_methods(false) & BaseModel.instance_methods 

false делает instance_methods не включают в себя унаследованные методы. Затем мы используем пересечение множества, чтобы найти все методы, определенные для SomeModel, которые ранее были определены в BaseModel (или Object).

+0

нет, это супер больной. благодаря! –

+1

BTW: если вы не знаете прямого суперкласса 'SomeModel' заранее, вы можете использовать' SomeModel.superclass' вместо 'BaseModel'. Таким образом, вы можете упаковать эту функциональность в метод многократного использования. Что-то вроде класса Class; def overriden_methods; instance_methods (false) & superclass.instance_methods end end' И затем: 'SomeModel.overriden_methods' –

+0

Имейте в виду, что это не будет ловить случаи, когда SomeModel смешивается с модулем, который определил create(). Это выражение даст вам только то, что SomeModel напрямую переопределило. –

Смежные вопросы