- Tags:
- example
- Polymorphism
Example: Polymorphism
- Contents
- Description
- Source
- Solution
- Output
Description
Create a class POINT and its heir CIRCLE to demonstrate polymorphic attachment and dynamic binding.
Source
Problem description from Rosetta Code: Polymorphism
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