Delegates: Difference between revisions
Content added Content deleted
Mercerenies (talk | contribs) (Latitude language added) |
|||
Line 754: | Line 754: | ||
=={{header|Elena}}== |
=={{header|Elena}}== |
||
ELENA |
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 |
class Operable : IOperable |
||
{ |
{ |
||
constructor |
constructor() {} |
||
⚫ | |||
operate |
operate() |
||
= "delegate implementation" |
= "delegate implementation"; |
||
} |
} |
||
class Delegator |
class Delegator |
||
{ |
{ |
||
object theDelegate |
object theDelegate; |
||
⚫ | |||
set Delegate:object |
|||
⚫ | |||
⚫ | |||
[ |
|||
⚫ | |||
]; |
|||
[ |
|||
theDelegate := object. |
|||
] |
|||
] |
|||
set Delegate(object) |
|||
⚫ | |||
= "default implementation". |
|||
⚫ | |||
⚫ | |||
internal operate(operable) |
|||
= |
= "default implementation"; |
||
operate |
internal operate(IOperable operable) |
||
= operable.operate(); |
|||
operate() |
|||
⚫ | |||
} |
} |
||
public program |
public program() |
||
{ |
|||
[ |
|||
var delegator := |
var delegator := new Delegator(); |
||
new object[]{nil, new Object(), new Operable()}.forEach:(o) |
|||
{ |
|||
delegator |
delegator.Delegate := o; |
||
console |
console.printLine(delegator.operate()) |
||
} |
|||
}</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; |
|||
operate |
operate() |
||
= "delegate implementation" |
= "delegate implementation"; |
||
} |
} |
||
class Delegator |
class Delegator |
||
{ |
{ |
||
object |
prop object Delegate; |
||
constructor |
constructor() |
||
{ |
|||
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 |
var operable := Delegate.Operable \ back:nil; |
||
if (nil == |
if (nil == operable) |
||
{ |
|||
^ "default implementation" |
^ "default implementation" |
||
} |
|||
else |
|||
{ |
|||
^ operable.operate() |
|||
} |
|||
⚫ | |||
} |
} |
||
public program |
public program() |
||
{ |
|||
[ |
|||
var delegator := |
var delegator := new Delegator(); |
||
new object[]{nil, new Object(), new Operable()}.forEach:(o) |
|||
{ |
|||
delegator |
delegator.Delegate := o; |
||
console |
console.printLine(delegator.operate()) |
||
} |
|||
}</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |