2015-01-29 5 views
2

Pharo Smalltalk - 메시지 전달을 통해 메시지를 가로 채어 다른 개체 (인스턴스)로 리디렉션 할 수 있습니까?Pharo Smalltalk - 메시지 포워딩을 통해 메시지를 가로 채어 다른 개체 (인스턴스)로 리디렉션 할 수 있습니까?

Objective-C에는 forwardInvocation이 있습니다. 예외가 발생하기 전에 호출되어받은 메시지에 대해 무엇인가를 할 수 있습니다.

스몰 토크에서 비슷한 것이 있습니까? 메시지를 대리인에게 리디렉션 할 수 있습니까?

+1

수행하려는 작업은 무엇입니까? 그러한 기능이 유용한 예제가 있습니까? 레오의 답에서 설명한대로 DNU를 사용할 수 있습니다. 그러나 대다수의 경우에는 어떤 종류의 "트릭"도 필요하지 않아야 함을 명심하십시오. –

답변

5

스몰 토크는 doesNotUnderstand: aMessage이며, 그렇지 않은 경우 정의되지 않은 방법 대신 수신자에게 전송됩니다. 당신은 예를 들어, 그것을 무시하고 당신이 원하는 무엇이든 할 (예를 들어, 다른 객체에 메시지를 전달, ..., 디스크에 기록) 할 수 있습니다

doesNotUnderstand: aMessage 
    aMessage sendTo: self delegate. 

당신이 실제로 정의를 "차단"메시지를 원하는 경우 조작의 모든 종류의 (새로운 수신기에 메시지를 리디렉션 사전 및 사후 실행 할 수 있습니다 원래의 방법 definitons을 대체 할 method wrappers를 사용하여

    1. 서브 클래 싱과 자신의 개체를 사용하여 : 개체에 대한 두 가지 옵션이 있습니다 -message-hooks, 랩된 메소드의 실행 방지 등).
  • +3

    _Method Wrapping_의 정식 텍스트는 [Brant, John, Brian Foote, Ralph E. Johnson und Don Roberts : _Wrappers to the Rescue_]입니다 (http://www.laputan.org/pub/foote/brant.pdf). 읽을 때 매우 흥미 롭습니다. Pharo 구현은 [ObjectProfile의 스파이 프레임 워크] (http://smalltalkhub.com/#!/~ObjectProfile/S2py)에서 찾을 수 있습니다. – MartinW

    +1

    '# doesNotUnderstand' *를 사용하면 간단한 메시지 보내기보다 느린 속도가됩니다 a) 전체 스택이 먼저 검색되고 b) VM이 메시지 객체를 구체화해야합니다 (부여 된 둘 다 오래 걸리지는 않지만 알면 중요 함). –

    +0

    안녕하세요, 다시이 주제로 돌아가겠습니다. 몇 가지 문제가 있습니다. 이 메시지는 객체 프로토콜을 따르는 메시지를 전달하려는 것으로 가정합니다. 전달자 자체가 객체이기 때문에이 메시지는 이해할 수 없으므로 #doesNotUnderstand를 사용할 수 없다는 것을 의미합니다. 리다이렉터 "객체"를 객체보다 기본 유형에서 하위 클래스로 전달할 수 있습니까? – unmircea