Delegates: Difference between revisions

Content added Content deleted
Line 754: Line 754:


=={{header|Elena}}==
=={{header|Elena}}==
ELENA 3.2 :
ELENA 3.4 :


Using multi methods:
Using multi methods:
<lang elena>import extensions.
<lang elena>import extensions.
import system'routines.
import system'routines.

class IOperable
interface IOperable
{
{
operate
abstract operate []
[
NotSupportedException new; raise.
]
}
}
class Operable :: IOperable
class Operable :: IOperable
{
{
constructor new []
operate
operate
= "delegate implementation".
= "delegate implementation".
Line 777: Line 776:
{
{
object theDelegate.
object theDelegate.
set Delegate:object
constructor new
[
[
theDelegate := nil.
if(nil == object)
[
theDelegate := nilValue.
];
[
theDelegate := object.
]
]
]
private operate(object operable)
set Delegate:obj
[
if ($nil == obj)
[ theDelegate := $nil. ];
[ theDelegate := obj. ].
]
operate(Object operable)
= "default implementation".
= "default implementation".
operate(IOperable operable)
private operate(IOperable operable)
= operable operate.
= operable operate.
operate
operate
<= operate(theDelegate).
<= operate(theDelegate).
}
}
program =
public program
[
[
var delegator := Delegator new.
var delegator := Delegator new.
Line 810: Line 808:
console printLine(delegator operate).
console printLine(delegator operate).
].
].
].</lang>
]</lang>
Generic solution:
Generic solution:
<lang elena>
<lang elena>import extensions.
import extensions.
import system'routines.
import system'routines.


class Operable
class Operable
{
{
operable = $self.
operable = self.
operate
operate
Line 826: Line 823:
class Delegator
class Delegator
{
{
object theDelegate.
object prop Delegate :: theDelegate.
constructor new
constructor new
[
[
theDelegate := nil.
theDelegate := nil.
]
set Delegate:obj
[
if ($nil == obj)
[ theDelegate := $nil. ];
[ theDelegate := obj. ].
]
]
Line 843: Line 833:
[
[
// 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 anOperable := theDelegate operable \ back:nil.
if ($nil == anOperable)
if (nil == anOperable)
[
[
^ "default implementation".
^ "default implementation".
Line 855: Line 845:
}
}
program =
public program
[
[
var delegator := Delegator new.
var delegator := Delegator new.
Line 865: Line 855:
console printLine(delegator operate).
console printLine(delegator operate).
].
].
].</lang>
]</lang>
{{out}}
{{out}}
<pre>
<pre>