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_t csize; /* size of the class instance */ |
||
char *cname; |
char *cname; /* name of the class */ |
||
Class parent; |
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; |
|||
} |
|||
} |
|||
⚫ | |||
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; |
||
⚫ | |||
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, |
&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, |
&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); |