This can be achieved with a little creative union and struct work. The
basic idea is to have a structure representing a superclass, which contains a
union of all the other subclasses.
You will need another entity (preferably an enumeration) in the superclass
and all subclasses to determine what type of struct it is.
Example:
typedef struct{
int type;
float ypos;
float xpos;
float length;
float height;
} Shape_Triangle
typedef struct{
int type;
float ypos;
float xpos;
float length;
} Shape_Square
typedef struct{
int type;
float ypos;
float xpos;
float radius;
} Shape_Circle
typedef union{
int type;
Shape_Square square;
Shape_Triangle triangle;
Shape_Circle circle;
} Shape;
...
Shape s = getShape();
switch(s.type)
{
case SHAPE_SQUARE:
s.Shape_Square.length=3;
break;
case SHAPE_TRIANGLE:
s.Shape_Triangle.height=4;
break;
case SHAPE_CIRCLE:
s.Shape_Circle.radius=5;
break;
}
A drawback of this method is that you need to duplicate the members in the
substructure, and you must make sure the type variables are all in the
same physical position (first is best) in the struct/union. Alternatively, use a struct for the superclass and subclass:
typedef struct{
float length;
float height;
} Shape_Triangle
typedef struct{
float length;
} Shape_Square
typedef struct{
float radius;
} Shape_Circle
typedef union{
Shape_Square square;
Shape_Triangle triangle;
Shape_Circle circle;
} Shape_Union;
typedef struct{
int type;
float xpos;
float ypos;
Shape_Union subshape;
}
...
Shape s = getShape();
switch(s.type)
{
case SHAPE_SQUARE:
s.subshape.Shape_Square.length=3;
break;
case SHAPE_TRIANGLE:
s.subshape.Shape_Triangle.height=4;
break;
case SHAPE_CIRCLE:
s.subshape.Shape_Circle.radius=5;
break;
}
This requires extra typing "through" the union.
No comments:
Post a Comment