2010-06-29 2 views
2

상속 체인에서 특정 메소드 호출을 선택하려면 어떻게해야합니까? 우우, C가 :그랜드 부모 메소드를 호출하고 루비에서 부모를 건너 뛰는 방법

TIA,

다니엘 어흥

+7

이와 같이 Ruby 문제를 해결하는 대신 디자인을 다시 생각해 볼 수 있습니다. 당신이 해결하려고하는 실제 문제는 무엇입니까? 다른 클래스를 상속하지만 구현 된 부모 메서드의 일부를 건너 뛰는 클래스는 매우 냄새가 난다. – Confusion

답변

5

당신은 당신이 필요하지만 경우

class C < B 
    def boo 
    A.instance_method(:boo).bind(self).call 
    puts "C:Boo" 
    end 
end 

을 할 수있는

class A 
    def boo; puts "A:Boo"; end 
end 

class B < A 
    def boo; super; puts "B:Boo"; end 
end 

class C < B 
    def boo; self.A.boo(???); puts "C:Boo"; end 
end 

따라서 출력이 될 것이다 , 그것은 일반적으로 디자인을 다시 생각해야한다는 지표입니다. 특히 C가 A의 구현을 boo으로해야한다면 B가 그것을 오버라이드해서는 안됩니다.

+2

나는 다른 방법으로 그것을 넣을 것이다. C가 B처럼 동작하지 않아야한다면 C는 B의 하위 클래스가 아니어야한다. –

+0

@ JörgWMittag : 좋은 지적. – sepp2k

+0

클래스 구조는 A-> B-> C이지만 B가 수행 한 작업과 오버로드 된 작업을 피하고 싶었지만 A가 제공 한 API의 일부를 Plugin 아키텍처의 일부로 인정해야했습니다. 클래스 B는 내가하고 싶었던 물건의 99 %를 가지고있다! – Daniel

관련 문제