49 lines
1.4 KiB
Nim
49 lines
1.4 KiB
Nim
####################################################################################################
|
||
# Base delegate.
|
||
|
||
type Delegate = ref object of RootObj
|
||
nil
|
||
|
||
method thing(d: Delegate): string {.base.} =
|
||
## Default implementation of "thing".
|
||
## Using a method rather than a proc allows dynamic dispatch.
|
||
"default implementation"
|
||
|
||
|
||
####################################################################################################
|
||
# Delegator.
|
||
|
||
type Delegator = object
|
||
delegate: Delegate
|
||
|
||
proc initDelegator(d: Delegate = nil): Delegator =
|
||
## Create a delegator with given delegate or nil.
|
||
if d.isNil:
|
||
Delegator(delegate: Delegate()) # Will use a default delegate instance.
|
||
else:
|
||
Delegator(delegate: d) # Use the provided delegate instance.
|
||
|
||
proc operation(d: Delegator): string =
|
||
## Calls the delegate.
|
||
d.delegate.thing()
|
||
|
||
|
||
####################################################################################################
|
||
# Usage.
|
||
|
||
let d = initDelegator()
|
||
echo "Without any delegate: ", d.operation()
|
||
|
||
type Delegate1 = ref object of Delegate
|
||
|
||
let d1 = initDelegator(Delegate1())
|
||
echo "With a delegate which desn’t provide the “thing” method: ", d1.operation()
|
||
|
||
type Delegate2 = ref object of Delegate
|
||
|
||
method thing(d: Delegate2): string =
|
||
"delegate implementation"
|
||
|
||
let d2 = initDelegator(Delegate2())
|
||
echo "With a delegate which provided the “thing” method: ", d2.operation()
|