J4

Contributed by Chris Rathman

Shape class (pshape.ijs)

coclass'pShape'

NB. attributes used by the class
xpos =: 0
ypos =: 0

NB. class constructor
create =: monad : 0
   moveTo (0 } y.), (1 } y.)
)

NB. class destructor
destroy =: codestroy

NB. accessors for x & y coordinates
getX =: monad : 'xpos'
getY =: monad : 'ypos'
setX =: monad : 'xpos =: y.'
setY =: monad : 'ypos =: y.'

NB. move the x & y coordinates
moveTo =: monad : 0
   setX 0 } y.
   setY 1 } y.
   ''
)
rMoveTo =: monad : 0
  moveTo ((getX '') + (0 } y.)), ((getY '') + (1 } y.))
)

NB. pseudo virtual routine - draw the shape
draw =: monad : ''

Rectangle class (prectangle.ijs)

coclass'pRectangle'
coextend'pShape'

NB. attributes used by the class
width =: 0
height =: 0

NB. class constructor
create =: monad : 0
   NB. supposed to be able to call overridden superclass method, but this
   NB. appears to be broken as both elements in the scribble array end up
   NB. with the same coordinates.  Just call moveTo directly instead.
   NB. create_pShape_ (0 } y.), (1 } y.)
   moveTo (0 } y.), (1 } y.)
   setWidth 2 } y.
   setHeight 3 } y.
   ''
)

NB. clas destructor
destroy =: codestroy

NB. accessors for width & height
getWidth =: monad : 'width'
getHeight =: monad : 'height'
setWidth =: monad : 'width =: y.'
setHeight =: monad : 'height =: y.'

NB. draw the rectangle
draw =: monad : 0
   WriteConsole__ 'Drawing a Rectangle at:(', (": getX''), ',', (": getY'')
   WriteConsole__ '), Width ', (": getWidth''), ' Height ', (": getHeight''), LF
)

Circle class (pcircle.ijs)

coclass'pCircle'
coextend'pShape'

NB. attributes used by the class
radius =: 0

NB. class constructor
create =: monad : 0
   NB. supposed to be able to call overridden superclass method, but this
   NB. appears to be broken as the both elements in the scribble array
   NB. end up with the same coordinates.  Just call moveTo directly instead.
   NB. create_pShape_ (0 } y.), (1 } y.)
   moveTo (0 } y.), (1 } y.)
   setRadius 2 } y.
   ''
)

NB. class destructor
destroy =: codestroy

NB. accessors for the radius
getRadius =: monad : 'radius'
setRadius =: monad : 'radius =: y.'

NB. draw the circle
draw =: monad : 0
   WriteConsole__ 'Drawing a Circle at:(', (": getX''), ',', (": getY'')
   WriteConsole__ '), Radius ', (": getRadius''), LF
)

Try shapes function (polymorph.ijs)

load 'user/classes/pShape.ijs'
load 'user/classes/pCircle.ijs'
load 'user/classes/pRectangle.ijs'

NB. J does not seem to have a notion of stdout, so I am using the
NB. Console package found on Oleg Kobchenko's J Page.  The package
NB. can be found at: http://members.xoom.com/olegyk/jpage.html
load 'user/console'

NB. define the test function
TryMe =: monad : 0
   NB. open up a console window for output
   AllocConsole''

   NB. create some shape instances
   scribble =. (10 20 5 6 conew 'pRectangle'), (15 25 8 conew 'pCircle')

   NB. iterate through the list and handle shapes polymorphically
   i =. 0
   while. i < # scribble do.
      temp =. i } scribble
      draw__temp''
      rMoveTo__temp 100 100
      draw__temp''
      i =. i + 1
   end.

   NB. call a rectangle specific function
   arect =. 0 0 15 15 conew 'pRectangle'
   setWidth__arect 30
   draw__arect''

   NB. deallocate the objects - no garbage collection
   i =. 0
   while. i < # scribble do.
      temp =. i } scribble
      destroy__temp''
      i =. i + 1
   end.
   destroy__arect''

   NB. close the console window
   FreeConsole''
)

NB. call the function to test polymorphism
TryMe''

Output

Drawing a Rectangle at:(10,20), Width 5 Height 6
Drawing a Rectangle at:(110,120), Width 5 Height 6
Drawing a Circle at:(15,25), Radius 8
Drawing a Circle at:(115,125), Radius 8
Drawing a Rectangle at:(0,0), Width 30 Height 15

Chris Rathman / Chris.Rathman@tx.rr.com