Delegates: Difference between revisions

Content deleted Content added
Franck (talk | contribs)
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