2014-10-19 2 views
1

클래스 상속을 사용할 때 메소드를 순서 지정하는 방법이 있습니까? 모든 공용 메서드를 순서대로 실행하는 클래스를 상속하므로 명령을 내리고 싶습니다. 예를 들어루비 상속시 주문 방법

:

class Foo 
    def action_two 
    puts "action 2" 
    end 
end 

class Bar < Foo 
    def action_one 
    puts "action 1" 
    end 
end 

Bar.instance_methods # => [:action_two, :action_one, ...] 

... 그리고 나는 그것이 순서에 대해 아무 말도하지 않습니다 [:action_one, :action_two, ...]

답변

2

documentation을 반환하고자하고 실제로 당신이 원하는 순서대로 도착 Ruby 2.1.2를 사용합니다. 당신이 그들을 특정 순서로 나오길 원한다면 나는 당신 스스로 그것을해야한다고 생각합니다. 당신은 현재 클래스의 메소드를 얻기 위해 instance_methodsinclude_super 매개 변수를 사용하여 다음의 방법에 대한 superclass 물어볼 수 : 당신이 다음에 할 것입니다 가능한 슈퍼 클래스로 BasicObject을 처리 할 거라면

class Bar < Foo 
    #... 
    def self.instance_methods 
    super(false) + superclass.instance_methods 
    end 
end 

superclass.instance_methods에 전화하기 전에 superclass.nil? 수표를 추가하십시오.

상속 계층이 깊은 경우 가장 낮은 기본 클래스 (이 경우 Foo)에이 해커를 넣고 하위 클래스가 상속을 통해 가져올 수 있어야합니다.

1

이렇게하려면 Foo을 상속 받기 전에 Bar#action_one을 정의해야합니다. Bar에 입력하십시오. 클래스 상속은 상속받은 클래스를 만들 때 결정되므로, 그렇게 할 수는 없습니다.

이것을 극복하는 방법은 Foo을 클래스 대신 모듈로 만들고 Bar#action_one이 정의 된 후 Bar에 포함시키는 것입니다.

module Foo 
    def action_two 
    puts "action 2" 
    end 
end 

class Bar 
    def action_one 
    puts "action 1" 
    end 
    include Foo 
end 

Bar.instance_methods 
# => [:action_one, :action_two, ...] 
+0

은 당신이 instance_methods'이 특정 순서로 일을 반환'생각하게? –

+0

이것은 MRI이므로 구현에 따라 다릅니다. 어떤 문서 나 사양에 대해서도 내가 알고있는 것은 아무것도 없으므로 주문에 관한 것이 무엇이든 될 수 있습니다. 당신의 주장을 뒷받침 할 소스 트레이스 나 링크가 보이지 않습니다. –

-1
Bar.ancestors.each_with_object([]) { |a, o| o << a.instance_methods }.flatten.uniq 
+0

'유니크 (uniq) '가 어떤 종류의 질서를 유지한다고 생각하니? –