Delegates: Difference between revisions
Content deleted Content added
Add NGS implementation |
|||
Line 1,207: | Line 1,207: | ||
del3@operate = "delegate implementation"; |
del3@operate = "delegate implementation"; |
||
Print[delegator[#]@operate] & /@ {del1, del2, del3};</lang> |
Print[delegator[#]@operate] & /@ {del1, del2, del3};</lang> |
||
{{out}} |
|||
<pre>default implementation |
|||
default implementation |
|||
delegate implementation</pre> |
|||
=={{header|NGS}}== |
|||
<lang NGS>{ |
|||
type Delegator |
|||
F init(d:Delegator) d.delegate = null |
|||
F default_impl(d:Delegator) 'default implementation' |
|||
F operation(d:Delegator) default_impl(d) |
|||
F operation(d:Delegator) { |
|||
guard defined thing |
|||
guard thing is Fun |
|||
try { |
|||
d.delegate.thing() |
|||
} |
|||
catch(e:ImplNotFound) { |
|||
# Might be unrelated exception, so check and optionally rethrow |
|||
e.callable !== thing throws e |
|||
default_impl(d) |
|||
} |
|||
} |
|||
F operation(d:Delegator) { |
|||
guard d.delegate is Null |
|||
default_impl(d) |
|||
} |
|||
a = Delegator() |
|||
echo(a.operation()) |
|||
# There is no method thing(s:Str) |
|||
a.delegate = "abc" |
|||
echo(a.operation()) |
|||
# ... now there is method thing(s:Str) |
|||
F thing(s:Str) 'delegate implementation' |
|||
echo(a.operation()) |
|||
}</lang> |
|||
{{out}} |
{{out}} |
||
<pre>default implementation |
<pre>default implementation |