diff --git a/documentation/current/examples/example-polymorphism.wiki b/documentation/current/examples/example-polymorphism.wiki new file mode 100644 index 00000000..290c1ee3 --- /dev/null +++ b/documentation/current/examples/example-polymorphism.wiki @@ -0,0 +1,218 @@ +[[Property:title|Example: Polymorphism]] +[[Property:weight|0]] +[[Property:uuid|e4a9db32-c087-21b7-f0d6-4685f0ce249d]] +==Description== + +Create a class POINT and its heir CIRCLE to demonstrate polymorphic attachment and dynamic binding. + + +==Source== + +Problem description from [http://rosettacode.org/wiki/Polymorphism Rosetta Code] + +Solution varies from Rosetta Code description (e. g., feature out is redefined in this solution, versus feature print.) + +==Solution== + + +class + POINT +inherit + ANY + redefine + out + end +create + make, make_origin + +feature -- Initialization + + make (a_x, a_y: INTEGER) + -- Create with values `a_x' and `a_y' + do + set_x (a_x) + set_y (a_y) + ensure + x_set: x = a_x + y_set: y = a_y + end + + make_origin + -- Create at origin + do + ensure + x_set: x = 0 + y_set: y = 0 + end + +feature -- Access + + x: INTEGER assign set_x + -- Horizontal axis coordinate + + y: INTEGER assign set_y + -- Vertical axis coordinate + +feature -- Element change + + set_x (a_x: INTEGER) + -- Set `x' coordinate to `a_x' + do + x := a_x + ensure + x_set: x = a_x + end + + set_y (a_y: INTEGER) + -- Set `y' coordinate to `a_y' + do + y := a_y + ensure + y_set: y = a_y + end + +feature -- Output + + out: STRING + -- Display as string + do + Result := "Point: x = " + x.out + " y = " + y.out + end +end + + + + +class + CIRCLE + +inherit + POINT + rename + make as point_make + redefine + make_origin, + out + end +create + make, make_origin, make_from_point + +feature -- Initialization + + make (a_x, a_y, a_r: INTEGER) + -- Create with values `a_x' and `a_y' and `a_r' + require + non_negative_radius_argument: a_r >= 0 + do + point_make (a_x, a_y) + set_r (a_r) + ensure + x_set: x = a_x + y_set: y = a_y + r_set: r = a_r + end + + make_origin + -- Create at origin with zero radius + do + Precursor + ensure then + r_set: r = 0 + end + + make_from_point (a_p: POINT; a_r: INTEGER) + -- Initialize from `a_r' with radius `a_r'. + require + non_negative_radius_argument: a_r >= 0 + do + set_x (a_p.x) + set_y (a_p.y) + set_r (a_r) + ensure + x_set: x = a_p.x + y_set: y = a_p.y + r_set: r = a_r + end + +feature -- Access + + r: INTEGER assign set_r + -- Radius + +feature -- Element change + + set_r (a_r: INTEGER) + -- Set radius (`r') to `a_r' + require + non_negative_radius_argument: a_r >= 0 + do + r := a_r + ensure + r_set: r = a_r + end + +feature -- Output + + out: STRING + -- Display as string + do + Result := "Circle: x = " + x.out + " y = " + y.out + " r = " + r.out + end + +invariant + + non_negative_radius: r >= 0 + +end + + + + +class + APPLICATION + +create + make + +feature {NONE} -- Initialization + + make + -- Run application. + local + my_point: POINT + my_circle: CIRCLE + do + create my_point.make_origin + print (my_point.out + "%N") + + create {CIRCLE} my_point.make_origin + print (my_point.out + "%N") + + create my_point.make (10, 15) + print (my_point.out + "%N") + + create {CIRCLE} my_point.make (20, 25, 5) + print (my_point.out + "%N") + + create my_circle.make (30, 35, 10) + print (my_circle.out + "%N") + + create my_circle.make_from_point (my_point, 35) + print (my_circle.out + "%N") + end + +end + + + +==Output== + + +Point: x = 0 y = 0 +Circle: x = 0 y = 0 r = 0 +Point: x = 10 y = 15 +Circle: x = 20 y = 25 r = 5 +Circle: x = 30 y = 35 r = 10 +Circle: x = 20 y = 25 r = 35 + +