Rosetta Example: Polymorphism

package req nx

nx::Class create Point {

  :property x:double
  :property y:double

  :public method print {} {
    return "Point(${:x},${:y})"
  }
}

nx::Class create Circle -superclass Point {

  :property radius:double

  :public method print {} {
    return "Circle(${:x},${:y},${:radius})"
  }
}

Demonstrating the behavior in a shell:

Create a point and get the print string:

% set p [Point new -x 1.0 -y 2.0]
% $p print
Point(1.0,2.0)

Get the x coordinate of this point:

% $p cget -x
1.0

Create a circle:

% set c [Circle new -x 3.0 -y 4.0 -radius 5.0]

Copy the circle

% set d [$c copy]

Change the radius of the copied circle:

% $d configure -radius 1.5

Print the two circles:

% $c print
Circle(3.0,4.0,5.0)

% $d print
Circle(3.0,4.0,1.5)