문제

그래서 나는 하나의 객체에 메시지를 전달하는 대의원 객체가 많은 응용 프로그램을 작성하고 있습니다. 아이디어는 내가 말할 수 있다는 것입니다

someObject sendMessage:aMessage

그리고 Amessage는 일부 Object의 대의원들에게 전송됩니다 (Amessage의 가치에 대해). 내가 이것을 할 수 있었던 유일한 방법은 다음과 같습니다.

sendMessage:aMessage

| sel chunks kwords arglist msg |
chunks := aMessage findTokens:' '.
kwords := Array new:(chunks size).
arglist := Array new:(chunks size).
1 to: (chunks size) do: [:i | 
    kwords at:i put:((chunks at:i) findTokens:':') at:1.
    arglist at:i put:((chunks at:i) findTokens:':') at:2].
sel := ''.
kwords do:[:word | sel := sel,word,':'].

msg := Message selector:sel arguments:arglist.
delegates do:[:del | del perform:msg selector with:msg arguments].

작동하지만 더 나은 방법이 있어야합니다. 이 솔루션은 논증을 현으로 제한하며, 단순히 추악합니다. 누구든지 더 깨끗하고 더 나은 메시지를 전달하는 방법을 알고 있습니까?

BTW, 나는 squeak를 사용하고 있지만 구현 독립적 솔루션이 선호 될 것입니다.)

편집하다: 대의원이 객체와 동일한 클래스에 있다고 덧붙여 야한다.

도움이 되었습니까?

해결책

As Arguments의 객체를 전달하려면 다음과 같은 메시지 패턴을 사용하는 별도의 목록으로 객체를 전달해야합니다.

sendmessage : aselector witharguments : argumentlist

그런 다음 #sendmessage : witharguments : as :

SendMessage : Aselector witharguments : Argumentlist

대의원 : [: 델 | 델 퍼포먼스 : Aselector witharguments : : ArgumentList].

그리고 실제 객체를 Args로 사용하여 임의로 복잡한 메시지를 전달할 수 있습니다.

| 인수 |

인수 : = 배열이있는 : : 1234.5 with : ( 'key'-> 'value').

sendebject sendmessage : #foo : bar : baz : witharguments : arguments

나는 이것이 대부분의 방언에도 휴대 할 수 있다고 생각합니다 ...

다른 팁

이것을 구현해보십시오 (객체가 이해하지 못하는 메시지 만 전달합니다. 가지다 대의원) :

doesNotUnderstand: aMessage 
    delegates
        do: [:delegate | aMessage sendTo: delegate]

메시지 개체가 명시 적으로 좋아하는 것을 구성 할 수 있습니다.

msg := Message selector: #foo arguments: #(bar baz)
"then use them like:"
anObject perform: msg selector with: msg arguments

Squeak에서는 클래스 객체 트레이서를 참조하십시오. 이를 사용하여 모든 메시지를 객체에 인터셉트 할 수 있습니다.

글쎄, Amessage가 무엇인지 알지 못하고, 모든 대표 객체가 같은 클래스라고 언급 했으므로 다음과 같은 일을 할 것입니다.

MyobjectClass>>SendMessage: aMessage

   self doSomethingUsefulOnThisInstanceIfApplicable: aMessage.
   self dependents do: [:ea | ea SendMessage: aMessage ] .

다음 메시지를 사용하는 것이 당신에게 효과가 있는지 확인하고 싶을 수도 있습니다.

update: 
update:with:
update:with:from:

왜 단순히 다형성을 사용하지 말고, 즉, 당신이 호출하는 각 객체의 클래스 에서이 방법을 구현하지 않습니까? 그런 다음 동일한 이름으로 객체 메소드를 구현하여 모든 하위 객체에 대한 호출을 위임합니다. 같은 것 :

MyObjectClass>>someMethod
subobjects do: [:each | each someMethod]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top