Delegates: Difference between revisions

Content added Content deleted
(Latitude language added)
Line 754: Line 754:


=={{header|Elena}}==
=={{header|Elena}}==
ELENA 3.4 :
ELENA 4.x :


Using multi methods:
Using multi methods:
<lang elena>import extensions.
<lang elena>import extensions;
import system'routines.
import system'routines;
interface IOperable
interface IOperable
{
{
abstract operate []
abstract operate() {}
}
}
class Operable :: IOperable
class Operable : IOperable
{
{
constructor new []
constructor() {}
operate
operate()
= "delegate implementation".
= "delegate implementation";
}
}
class Delegator
class Delegator
{
{
object theDelegate.
object theDelegate;
set Delegate:object
[
if(nil == object)
[
theDelegate := nilValue.
];
[
theDelegate := object.
]
]
private operate(object operable)
set Delegate(object)
{
= "default implementation".
theDelegate := object
}
private operate(IOperable operable)
internal operate(operable)
= operable operate.
= "default implementation";
operate
internal operate(IOperable operable)
<= operate(theDelegate).
= operable.operate();
operate()
<= operate(theDelegate);
}
}
public program
public program()
{
[
var delegator := Delegator new.
var delegator := new Delegator();
(nil, Object new, Operable new) forEach(:o)
new object[]{nil, new Object(), new Operable()}.forEach:(o)
[
{
delegator Delegate := o.
delegator.Delegate := o;
console printLine(delegator operate).
console.printLine(delegator.operate())
].
}
]</lang>
}</lang>
Generic solution:
Generic solution:
<lang elena>import extensions.
<lang elena>import extensions;
import system'routines.
import system'routines;


class Operable
class Operable
{
{
operable = self.
Operable = self;
operate
operate()
= "delegate implementation".
= "delegate implementation";
}
}
class Delegator
class Delegator
{
{
object prop Delegate :: theDelegate.
prop object Delegate;
constructor new
constructor()
[
{
theDelegate := nil.
Delegate := nil
]
}
operate
operate()
[
{
// if the object does not support "get&operable" message - returns nil
// if the object does not support "get&operable" message - returns nil
var anOperable := theDelegate operable \ back:nil.
var operable := Delegate.Operable \ back:nil;
if (nil == anOperable)
if (nil == operable)
[
{
^ "default implementation".
^ "default implementation"
];
}
[
else
^ anOperable operate.
{
].
^ operable.operate()
]
}
}
}
}
public program
public program()
{
[
var delegator := Delegator new.
var delegator := new Delegator();
(nil, Object new, Operable new) forEach(:o)
new object[]{nil, new Object(), new Operable()}.forEach:(o)
[
{
delegator Delegate := o.
delegator.Delegate := o;
console printLine(delegator operate).
console.printLine(delegator.operate())
].
}
]</lang>
}</lang>
{{out}}
{{out}}
<pre>
<pre>