button.message();
call button.message with();
このような構造の場合、c slot は例外を生じます。したがって、c parent1 slot もしくは c parent2 slot とメッセージを流すパスを明示的にしてやる必要があります。--sumimglobals _AddSlotsIfAbsent: (| p1=(). p2=(). c=() |) p1 _Define: (| slot=(^'p1') |) p2 _Define: (| slot=(^'p2') |) c _Define: (| parent1*=p1. parent2*=p2 |)
!Handler methodsFor: 'request dispatching'!
doseNotUnderstand: aMessage
"自分が扱えないリクエストは後継者に託す。"
^ successor perform: aMessage selector! !
!Handler class methodsFor: 'example'!
example2
"a HelpButton、a Dialog、an Application は、preview、print、help のいずれかの
リクエストに応答キることができる。今、a HelpButton → a Dialog → an Application
というリクエストを委譲するための連鎖があるとき、a HelpButton に preview、print、
help と順次リクエストして何が起こるかを観察する。"
"Handler example2"
| button dialog application |
button := HelpButton new.
dialog := Dialog new.
application := Application new.
button successor: (dialog successor: application).
World findATranscript: nil.
#(preview print help) do: [ :request |
| handler |
Transcript cr.
Transcript show: button printString, ' が ', request, ' リクエストを受け取り…、'.
handler := button perform: request.
Transcript show: handler printString, ' が処理しました。']
"出力例:
a HelpButton が preview リクエストを受け取り…、an Application が処理しました。
a HelpButton が print リクエストを受け取り…、a Dialog が処理しました。
a HelpButton が help リクエストを受け取り…、a HelpButton が処理しました。"! !--sumimfunc FullLookup(start, name) begin
local left := start;
while left <> nil do begin
local current := left;
while current <> nil do begin
if HasSlot(current, name) then
return GetSlot(current, name); // success
current := GetSlot(current, '_proto);
end;
left := GetSlot(left, '_parent);
end;
// failure
end;--GNUE(鵺)このページを編集 (15540 bytes)
| 以下の 2 ページから参照されています。 |
This page has been visited 5330 times.