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