View · Search · Index

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