2023-07-01 11:58:00 -04:00
|
|
|
import extensions;
|
|
|
|
|
import system'routines;
|
|
|
|
|
|
|
|
|
|
class Operable
|
|
|
|
|
{
|
|
|
|
|
Operable = self;
|
|
|
|
|
|
|
|
|
|
operate()
|
|
|
|
|
= "delegate implementation";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Delegator
|
|
|
|
|
{
|
2025-08-11 18:05:26 -07:00
|
|
|
object? Delegate : prop;
|
2023-07-01 11:58:00 -04:00
|
|
|
|
|
|
|
|
constructor()
|
|
|
|
|
{
|
|
|
|
|
Delegate := nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
operate()
|
|
|
|
|
{
|
2023-09-16 17:28:03 -07:00
|
|
|
// if the object does not support "Operable" message - returns nil
|
2025-08-11 18:05:26 -07:00
|
|
|
var operable := Delegate?.Operable \ back(nil);
|
2023-07-01 11:58:00 -04:00
|
|
|
|
|
|
|
|
if (nil == operable)
|
|
|
|
|
{
|
|
|
|
|
^ "default implementation"
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
^ operable.operate()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-01 16:33:20 -08:00
|
|
|
public Program()
|
2023-07-01 11:58:00 -04:00
|
|
|
{
|
|
|
|
|
var delegator := new Delegator();
|
|
|
|
|
|
2024-03-06 22:25:12 -08:00
|
|
|
new object[]{nil, new Object(), new Operable()}.forEach::(o)
|
2023-07-01 11:58:00 -04:00
|
|
|
{
|
|
|
|
|
delegator.Delegate := o;
|
|
|
|
|
|
2025-08-11 18:05:26 -07:00
|
|
|
Console.printLine(delegator.operate())
|
2023-07-01 11:58:00 -04:00
|
|
|
}
|
|
|
|
|
}
|