2019-09-12 10:33:56 -07:00
|
|
|
import extensions;
|
|
|
|
|
import system'routines;
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
interface IOperable
|
2017-09-23 10:01:46 +02:00
|
|
|
{
|
2019-09-12 10:33:56 -07:00
|
|
|
abstract operate() {}
|
2017-09-23 10:01:46 +02:00
|
|
|
}
|
|
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
class Operable : IOperable
|
2017-09-23 10:01:46 +02:00
|
|
|
{
|
2019-09-12 10:33:56 -07:00
|
|
|
constructor() {}
|
|
|
|
|
|
|
|
|
|
operate()
|
|
|
|
|
= "delegate implementation";
|
2017-09-23 10:01:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Delegator
|
|
|
|
|
{
|
2019-09-12 10:33:56 -07:00
|
|
|
object theDelegate;
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
set Delegate(object)
|
|
|
|
|
{
|
|
|
|
|
theDelegate := object
|
|
|
|
|
}
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
internal operate(operable)
|
|
|
|
|
= "default implementation";
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
internal operate(IOperable operable)
|
|
|
|
|
= operable.operate();
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
operate()
|
|
|
|
|
<= operate(theDelegate);
|
2017-09-23 10:01:46 +02:00
|
|
|
}
|
|
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
public program()
|
|
|
|
|
{
|
|
|
|
|
var delegator := new Delegator();
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2020-02-17 23:21:07 -08:00
|
|
|
new::(nil, new Object(), new Operable()).forEach:(o)
|
2019-09-12 10:33:56 -07:00
|
|
|
{
|
|
|
|
|
delegator.Delegate := o;
|
2017-09-23 10:01:46 +02:00
|
|
|
|
2019-09-12 10:33:56 -07:00
|
|
|
console.printLine(delegator.operate())
|
|
|
|
|
}
|
|
|
|
|
}
|