Delegates: Difference between revisions

m
(Latitude language added)
Line 754:
 
=={{header|Elena}}==
ELENA 3.4.x :
 
Using multi methods:
<lang elena>import extensions.;
import system'routines.;
interface IOperable
{
abstract operate() []{}
}
class Operable :: IOperable
{
constructor() new []{}
operate()
= "delegate implementation".;
}
class Delegator
{
object theDelegate.;
set Delegate:object
[
if(nil == object)
[
theDelegate := nilValue.
];
[
theDelegate := object.
]
]
privateset operateDelegate(object operable)
{
= "default implementation".
if(niltheDelegate =:= object)
}
privateinternal operate(IOperable operable)
= operable"default operate.implementation";
internal operate(IOperable operable)
<= operable.operate(theDelegate).;
operate()
<= operate(theDelegate := nilValue.);
}
public program()
{
[
var delegator := Delegator new. Delegator();
(new object[]{nil, new Object(), new, Operable new() }.forEach(:(o)
[{
delegator .Delegate := o.;
console .printLine(delegator .operate()).
].}
]}</lang>
Generic solution:
<lang elena>import extensions.;
import system'routines.;
 
class Operable
{
operableOperable = self.;
operate()
= "delegate implementation".;
}
class Delegator
{
prop object prop Delegate :: theDelegate.;
constructor new()
[{
theDelegateDelegate := nil.
]}
operate()
[{
// if the object does not support "get&operable" message - returns nil
var anOperableoperable := theDelegate operableDelegate.Operable \ back:nil.;
if (nil == anOperableoperable)
[{
^ "default implementation".
];}
[else
^ anOperable operate.{
] ^ operable.operate()
] }
[}
}
public program ()
{
[
var delegator := Delegator new. Delegator();
(new object[]{nil, new Object(), new, Operable new() }.forEach(:(o)
[{
delegator .Delegate := o.;
console .printLine(delegator .operate()).
].}
]}</lang>
{{out}}
<pre>
Anonymous user