2010-08-15 1 views
2

메서드가 프로그래밍 방식으로 하위 클래스에 의해 재정의되었는지 여부를 확인하는 방법이 있습니까? 다음과 같이 작동하는 것 :클래스 계층 구조에서 메소드가 정의되고 루비에서 재정의 된 부분을 어떻게 알 수 있습니까?

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 

falseinstance_methods 상속 방법을 포함하지 있습니다. 그런 다음 set intersection을 사용하여 이전에 BaseModel (또는 Object)에 정의 된 SomeModel에 정의 된 모든 메서드를 찾습니다.

+0

그건 절대 아프다. 감사! –

+1

BTW :'SomeModel'의 직접적인 수퍼 클래스를 미리 모른다면'BaseModel' 대신'SomeModel.superclass'를 사용할 수 있습니다. 그렇게하면 재사용 가능한 방법으로이 기능을 패키지화 할 수 있습니다. '클래스 클래스; def overriden_methods; 'SomeModel.overriden_methods' –

+0

SomeModel이 create()를 정의한 모듈을 섞어 놓은 경우를 잡아 내지 못한다는 것을 알아 두십시오. 이 식은 SomeModel이 직접 오버라이드 한 메소드만을 제공합니다. –