Polymorphism

From Rosetta Code
Revision as of 05:15, 23 February 2007 by 74.56.102.15 (talk) (→‎[[BASIC]])
Task
Polymorphism
You are encouraged to solve this task according to the task description, using any language you may know.

Create two classes Point and Circle with a polymorphic function

BASIC

Interpeter: QuickBasic 4.5, PB 7.1

DECLARE SUB PointInit0 (pthis AS Point)
DECLARE SUB PointInit1 (pthis AS Point, x0 AS INTEGER)
DECLARE SUB PointInit2 (pthis AS Point, x0 AS INTEGER, y0 AS INTEGER)
DECLARE FUNCTION PointGetX (pthis AS Point)
DECLARE FUNCTION PointGetY (pthis AS Point)
DECLARE SUB PointSetX (pthis AS Point, x0 AS INTEGER)
DECLARE SUB PointSetY (pthis AS Point, y0 AS INTEGER)
DECLARE SUB PointPrint (pthis AS Point)
DECLARE SUB CircleInit0 (pthis AS Circle)
DECLARE SUB CircleInit1 (pthis AS Circle, x0 AS INTEGER)
DECLARE SUB CircleInit2 (pthis AS Circle, x0 AS INTEGER, y0 AS INTEGER)
DECLARE FUNCTION CircleGetX (pthis AS Circle)
DECLARE FUNCTION CircleGetY (pthis AS Circle)
DECLARE FUNCTION CircleGetR (pthis AS Circle)
DECLARE SUB CircleSetX (pthis AS Circle, x0 AS INTEGER)
DECLARE SUB CircleSetY (pthis AS Circle, y0 AS INTEGER)
DECLARE SUB CircleSetR (pthis AS Circle, r0 AS INTEGER)
DECLARE SUB CirclePrint (pthis AS Circle)
TYPE Point
  x AS INTEGER
  y AS INTEGER
END TYPE
TYPE Circle
  p AS Point
  r AS INTEGER
END TYPE
DIM p AS Point
DIM c AS Circle
PointInit p
PointPrint p
CircleInit p
CirclePrint p

C

Compiler: GCC, MSVC, BCC, Watcom

Libraries: Standard

 /* After reading this you may understand */ 
 /* why Bjarne Stroustrup's invented C++  */
 #if defined( _WIN32 ) || defined( MSC_VER )
 #define FN_PTR(x) (& x)
 #else
 #define FN_PTR(x) (x)
 #endif
 typedef struct Point
 {
   int x;
   int y;
   void (*dtor)();   /* virtual */
   void (*print)();  /* virtual */
 } Point;
 Point* Point_new0()
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   memset(pthis, 0, sizeof( Point ) );
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
 }
 Point* Point_new1(int x0)
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   pthis->x = x0;
   pthis->y = 0;
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
 }
 Point* Point_new2(int x0, int y0)
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   pthis->x = x0;
   pthis->y = y0;
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
 }
 void Point_delete(Point** pthis)
 {
   if(pthis && *pthis)
   {
     (*pthis)->dtor();
     free(*pthis); *pthis = NULL;
   }
 }
 Point* Point_copy(Point* p)
 {
   Point* pthis = (Point*) malloc( sizeof( Point ) );
   memcpy(pthis, p, sizeof( Point ) );
   pthis->dtor  = FN_PTR(Point_dtor);
   pthis->print = FN_PTR(Point_print);
   return pthis;
 }
 int Point_getX(Point* pthis) { return pthis->x; }
 int Point_getY(Point* pthis) { return pthis->y; }
 int Point_setX(Point* pthis, int x0) { pthis->x = x0; }
 int Point_setY(Point* pthis, int y0) { pthis->y = y0; }
 void Point_print() { printf("Point\n"); }
 void Point_dtor() {}
 // Trick: This way Circle.x, Circle.y, Circle.r are available
 typedef union Circle
 {
   Point point;
   struct _Circle
   {
     Point point;
     int r;
   };
 } Circle;


 Circle* Circle_new0()
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   memset(pthis, 0, sizeof( Circle ) );
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_new1(int x0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = x0;
   pthis->y = 0;
   pthis->r = 0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_new2(int x0, int y0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = x0;
   pthis->y = y0;
   pthis->r = 0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_new3(int x0, int y0, int r0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = x0;
   pthis->y = y0;
   pthis->r = r0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_newP0(Point* p)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = p->x;
   pthis->y = p->y;
   pthis->r = 0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 Circle* Circle_newP1(Point* p, int r0)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   pthis->x = p->x;
   pthis->y = p->y;
   pthis->r = r0;
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
 }
 void Circle_delete(Circle** pthis)
 {
   if(pthis && *pthis)
   {
     (*pthis)->dtor();
     free(*pthis); *pthis = NULL;
   }
 }
 Circle* Circle_copy(Circle* c)
 {
   Circle* pthis = (Circle*) malloc( sizeof( Circle ) );
   memcpy(pthis, c, sizeof( Circle ) );
   pthis->dtor  = FN_PTR(Circle_dtor);
   pthis->print = FN_PTR(Circle_print);
   return pthis;
 }
 int Circle_getX(Circle* pthis) { return pthis->x; }
 int Circle_getY(Circle* pthis) { return pthis->y; }
 int Circle_getR(Circle* pthis) { return pthis->r; }
 int Circle_setX(Circle* pthis, int x0) { pthis->x = x0; }
 int Circle_setY(Circle* pthis, int y0) { pthis->y = y0; }
 int Circle_setR(Circle* pthis, int r0) { pthis->r = r0; }
 void Circle_print() { printf("Circle\n"); }
 void Circle_dtor() {}
 int main()
 {
    Point* p = Point_new0();
    Point* c = (Point*)Circle_new0();
    p->print();
    c->print();     
    return 0;
 }

C++

Compiler: GCC, Visual C++, BCC, Watcom

 class Point
 {
   protected:
     int x, y;
   public:
     Point(int x0 = 0, int y0 = 0) : x(x0), y(y0) {}
     Point(const Point& p) : x(p.x), y(p.y) {}
     virtual ~Point() {}
     const Point& operator=(const Point& p)
     {
       if(this != &p)
       {
         x = p.x;
         y = p.y;
       }
       return *this;
     }
     int getX() { return x; }
     int getY() { return y; }
     int setX(int x0) { x = x0; }
     int setY(int y0) { y = y0; }
     virtual void print() { printf("Point\n"); }
 };
 class Circle : public Point
 {
   private:
     int r;
   public:
     Circle(Point p, int r0 = 0) : Point(p), r(r0) {}
     Circle(int x0 = 0, int y0 = 0, int r0 = 0) : Point(x0, y0), r(r0) {}
     virtual ~Circle() {}
     const Circle& operator=(const Circle& c)
     {
       if(this != &c)
       {
         x = c.x;
         y = c.y;
         r = c.r;
       }
       return *this;
     }
     int getR() { return r; }
     int setR(int r0) { r = r0; }
     virtual void print() { printf("Circle\n"); }
 };
int main()
{
   Point* p = new Point();
   Point* c = new Circle();
   p->print();
   c->print();     
   return 0;
}

C#


D

Compiler: DMD,GDC

Forth

Fortran

Java

class Point
{
  protected int x, y;
  public Point() { this(0); }
  public Point(int x0) { this(x0,0); }
  public Point(int x0, int y0) { x = x0; y = y0; }
  public int getX() { return x; }
  public int getY() { return y; }
  public int setX(int x0) { x = x0; }
  public int setY(int y0) { y = y0; }
  public void print() { System.out.println("Point"); }
}
public class Circle extends Point
{
  private int r;
  public Circle(Point p) { this(p,0); }
  public Circle(Point p, int r0) { super(p); r = r0; }
  public Circle() { this(0); }
  public Circle(int x0) { this(x0,0); }
  public Circle(int x0, int y0) { this(x0,y0,0); }
  public Circle(int x0, int y0, int r0) { super(x0,y0); r = r0; }
  public int getR() { return r; }
  public int setR(int r0) { r = r0; }
  public void print() { System.out.println("Circle"); }
  public static void main(String args[])
  {
    Point p = new Point();
    Point c = new Circle();
    p.print();
    c.print();     
  }
}

JavaScript


Perl

Interpeter: Perl


PHP