55 lines
1.1 KiB
Plaintext
55 lines
1.1 KiB
Plaintext
interface Thingable {
|
|
method : virtual : public : Thing() ~ String;
|
|
}
|
|
|
|
class Delegator {
|
|
@delegate : Thingable;
|
|
|
|
New() {
|
|
}
|
|
|
|
method : public : SetDelegate(delegate : Thingable) ~ Nil {
|
|
@delegate := delegate;
|
|
}
|
|
|
|
method : public : Operation() ~ String {
|
|
if(@delegate = Nil) {
|
|
return "default implementation";
|
|
}
|
|
else {
|
|
return @delegate->Thing();
|
|
};
|
|
}
|
|
}
|
|
|
|
class Delegate implements Thingable {
|
|
New() {
|
|
}
|
|
|
|
method : public : Thing() ~ String {
|
|
return "delegate implementation";
|
|
}
|
|
}
|
|
|
|
class Example {
|
|
function : Main(args : String[]) ~ Nil {
|
|
# Without a delegate:
|
|
a := Delegator->New();
|
|
Runtime->Assert(a->Operation()->Equals("default implementation"));
|
|
|
|
# With a delegate:
|
|
d := Delegate->New();
|
|
a->SetDelegate(d);
|
|
Runtime->Assert(a->Operation()->Equals("delegate implementation"));
|
|
|
|
# Same as the above, but with an anonymous class:
|
|
a->SetDelegate(Base->New() implements Thingable {
|
|
method : public : Thing() ~ String {
|
|
return "anonymous delegate implementation";
|
|
}
|
|
});
|
|
|
|
Runtime->Assert(a->Operation()->Equals("anonymous delegate implementation"));
|
|
}
|
|
}
|