Rosetta example: Polymorphic copy
-Let a polymorphic object contain an instance of some specific type S -derived from a type T. The type T is known. The type S is possibly -unknown until run time. The objective is to create an exact copy of -such polymorphic object.
package req nx
nx::Object provides a method copy
which creates a deep copy of any
-source object (hence, polymorphic in the sense of this task), i.e.,
-it contains all structural and behavioral features of the source and
-preserves its signature type.
nx::Class create T { - :property -accessor public {label "T"} -} -nx::Class create S -superclasses T { - :property -accessor public {label "S"} -} - -set client [nx::Object new { - :public object method duplicate {src} { - # this is the polymorphic call site - return [$src copy] - } -}] - -set t [T new] -% $t label get -T -set s [S new] -% $s label get -S
Provide two copies, using copy
underneath
set t2 [$client duplicate $t] -set s2 [$client duplicate $s]
Are the copies truly independent objects (identities)? Yes …
% expr {$t2 ne $t} -1 -% expr {$s2 ne $s} -1
Are the copies offsprings of the source types/classes? Yes …
% $t info class -::T -% $t2 info class -::T - -% $s info class -::S -% $s2 info class -::S
Do the copies operate exactly like their source objects? Yes …
% $t label get -T -% $t2 label get -T - -% $s label get -S -% $s2 label get -S