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 |)
--sumim!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 が処理しました。"! !
--GNUE(鵺)func 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;
このページを編集 (15540 bytes)
以下の 2 ページから参照されています。 |
This page has been visited 5853 times.