Delegates: Difference between revisions

Line 754:
 
=={{header|Elena}}==
ELENA 3.24 :
 
Using multi methods:
<lang elena>import extensions.
import system'routines.
 
classinterface IOperable
{
abstract operate []
[
NotSupportedException new; raise.
]
}
class Operable :: IOperable
{
constructor new []
[
operate
= "delegate implementation".
Line 777 ⟶ 776:
{
object theDelegate.
]
set Delegate:objobject
constructor new
[
theDelegateif(nil :== nil.object)
[
[ theDelegate := obj. ]nilValue.
];
[
[ theDelegate := obj. ]object.
]
]
private operate(Objectobject operable)
set Delegate:obj
[
if ($nil == obj)
[ theDelegate := $nil. ];
[ theDelegate := obj. ].
]
operate(Object operable)
= "default implementation".
private operate(IOperable operable)
= operable operate.
operate
<= operate(theDelegate).
}
programpublic =program
[
var delegator := Delegator new.
Line 810 ⟶ 808:
console printLine(delegator operate).
].
].</lang>
Generic solution:
<lang elena>import extensions.
import extensions.
import system'routines.
 
class Operable
{
operable = $self.
operate
Line 826 ⟶ 823:
class Delegator
{
object prop Delegate :: theDelegate.
constructor new
[
theDelegate := nil.
]
set Delegate:obj
[
if ($nil == obj)
[ theDelegate := $nil. ];
[ theDelegate := obj. ].
]
Line 843 ⟶ 833:
[
// if the object does not support "get&operable" message - returns nil
var anOperable := theDelegate operable \ back:$nil.
if ($nil == anOperable)
[
^ "default implementation".
Line 855 ⟶ 845:
}
public program =
[
var delegator := Delegator new.
Line 865 ⟶ 855:
console printLine(delegator operate).
].
].</lang>
{{out}}
<pre>
Anonymous user