Inheritance/Single/C: Difference between revisions

Content added Content deleted
(nes C Inheritance)
 
(fix inheritance related problems, static functions)
Line 20: Line 20:
typedef char * (*SpeakFctn)(Animal s);
typedef char * (*SpeakFctn)(Animal s);
typedef void (*DestroyFctn)(Animal s);
typedef void (*DestroyFctn)(Animal s);
typedef void (*ClsRecInit)(Class c);


typedef struct object {
typedef struct object {
Line 26: Line 27:


typedef struct sclass {
typedef struct sclass {
size_t csize; /* size of the class instance */
size_t csize; /* size of the class instance */
char *cname; /* name of the class */
char *cname; /* name of the class */
Class parent; /* parent class */
Class parent; /* parent class */
ClsRecInit crInit; /* handle method inheritance for class record */


CloneFctn clone; /* clone function */
CloneFctn clone; /* clone function */
Line 35: Line 37:
} sClass;
} sClass;


#define O_INHERIT (void *)-1
extern void ClassRecInit(Class c);
extern void DfltClsInit(Class c);
extern sClass boc;</lang>
extern sClass boc;</lang>
<lang c>/* Animal.c */
<lang c>/* Animal.c */
Line 78: Line 83:
{ if (s) obj_del( s, s->class ); }
{ if (s) obj_del( s, s->class ); }


void ClassRecInit( Class c)
{
if (c->crInit) {
(*c->crInit)(c);
c->crInit = NULL;
}
}
static
void baseClsRecInit(Class c )
{
if ((O_INHERIT == c->speak) && c->parent)
c->speak = c->parent->speak;
}
void DfltClsInit(Class c)
{
if (c->parent && c->parent->crInit) {
ClassRecInit(c->parent);
}
printf("Initializing class %s\n", c->cname);
baseClsRecInit(c);
}
/* * * * * * */
/* * * * * * */
static
static
Line 91: Line 117:
}
}


sClass boc = { sizeof(SObject), "Animal", NULL,
sClass boc = { sizeof(SObject), "Animal", NULL, &baseClsRecInit,
&baseClone, &baseSpeak, NULL };
&baseClone, &baseSpeak, NULL };
Class AnimalClass = &boc;</lang>
Class AnimalClass = &boc;</lang>
Line 110: Line 136:
DogPart dog;
DogPart dog;
};
};

extern void InitDog(DogPart *dogp, char *name, char *color, double weight);

extern sClass dogc;</lang>
extern sClass dogc;</lang>


Line 136: Line 165:
}
}


sClass dogc = { sizeof(struct sDog), "Dog", &boc,
sClass dogc = { sizeof(struct sDog), "Dog", &boc, &DfltClsInit,
&dogClone, &dogSpeak, NULL };
&dogClone, &dogSpeak, NULL };
Class DogClass = &dogc;
Class DogClass = &dogc;



static
void InitDog(DogPart *dogp, char *name, char *color, double weight)
void InitDog(DogPart *dogp, char *name, char *color, double weight)
{
{
Line 152: Line 181:
Dog dog = (Dog)malloc(DogClass->csize);
Dog dog = (Dog)malloc(DogClass->csize);
if (dog) {
if (dog) {
ClassRecInit(DogClass);
dog->class = DogClass;
dog->class = DogClass;
InitDog(&dog->dog, name, color, weight);
InitDog(&dog->dog, name, color, weight);
Line 199: Line 229:
}
}


sClass labc = { sizeof(struct sLab), "Lab", &dogc,
sClass labc = { sizeof(struct sLab), "Lab", &dogc, &DfltClsInit,
&labClone, &dogSpeak, NULL };
&labClone, O_INHERIT, NULL };
Class LabClass = &labc;
Class LabClass = &labc;


Line 207: Line 237:
Lab dog = (Lab)malloc(LabClass->csize);
Lab dog = (Lab)malloc(LabClass->csize);
if (dog) {
if (dog) {
ClassRecInit(LabClass);
dog->class = LabClass;
dog->class = LabClass;
InitDog( &dog->dog, name, color, weight);
InitDog( &dog->dog, name, color, weight);
Line 252: Line 283:
}
}


sClass colliec = { sizeof(struct sCollie), "Collie", &dogc,
sClass colliec = { sizeof(struct sCollie), "Collie", &dogc, &DfltClsInit,
&collieClone, &dogSpeak, NULL };
&collieClone, O_INHERIT, NULL };
Class CollieClass = &colliec;
Class CollieClass = &colliec;


Line 260: Line 291:
Collie dog = (Collie)malloc(CollieClass->csize);
Collie dog = (Collie)malloc(CollieClass->csize);
if (dog) {
if (dog) {
ClassRecInit(CollieClass);
dog->class = CollieClass;
dog->class = CollieClass;
InitDog( &dog->dog, name, color, weight);
InitDog( &dog->dog, name, color, weight);
Line 320: Line 352:
}
}


sClass catcls = { sizeof(struct sCat), "Cat", &boc,
sClass catcls = { sizeof(struct sCat), "Cat", &boc, &DfltClsInit,
&catClone, &catSpeak, &catDel };
&catClone, &catSpeak, &catDel };
Class CatClass = &catcls;
Class CatClass = &catcls;
Line 329: Line 361:
if (cat) {
if (cat) {
CatPart *catpart = &(cat->catpart);
CatPart *catpart = &(cat->catpart);
ClassRecInit(CatClass);
cat->class = CatClass;
cat->class = CatClass;
catpart->name = strdup(name);
catpart->name = strdup(name);