Inheritance/Single/C: Difference between revisions

 
Line 1:
==Manual Object System==
Although [[C]] is not considered an OO language, you can do the following, which provides a semblance of an OO infrastructure allowing Inheritance and Polymorphism. The original [[C++]] was a front end which translated C++ code to C. (C++ was much simpler in those days.)"
<syntaxhighlight lang="c">
<lang c>/* Animal.h */
#ifndef _ANIMAL_H
#define _ANIMAL_H
Line 14 ⟶ 15:
extern Animal ObjClone(Animal a);
extern void ObjDestroy(Animal a);
#endif</lang>
</syntaxhighlight>
 
<langsyntaxhighlight lang="c">/* AnimalProt.h */
#include "Animal.h"
typedef struct sclass *Class;
Line 42 ⟶ 44:
extern void ClassRecInit(Class c);
extern void DfltClsInit(Class c);
extern sClass boc;</lang>
</syntaxhighlight>
<lang c>/* Animal.c */
 
<langsyntaxhighlight lang="c">/* Animal.c */
#include "AnimalProt.h"
 
Line 121 ⟶ 125:
sClass boc = { sizeof(SObject), "Animal", NULL, &baseClsRecInit,
&baseClone, &baseSpeak, NULL };
Class AnimalClass = &boc;</lang>
</syntaxhighlight>
 
<syntaxhighlight lang="c">
<lang c>/* DogProt.h */
#include "AnimalProt.h"
 
Line 141 ⟶ 147:
extern void InitDog(DogPart *dogp, char *name, char *color, double weight);
 
extern sClass dogc;</lang>
</syntaxhighlight>
 
<langsyntaxhighlight lang="c">/* Dog.c */
/** * * * * * * * * * * * * * * * * * *
* Dog - a class derived from Animal
Line 188 ⟶ 195:
}
return (Animal)dog;
}
}</lang>
</syntaxhighlight>
<lang c>/* Dog.h */
 
<syntaxhighlight lang="c">
<lang c>/* Dog.h */
#ifndef _DOG_H
#define _DOG_H
#include "Animal.h"
extern Animal NewDog(char *name, char *color, double weight);
#endif</lang>
</syntaxhighlight>
 
<syntaxhighlight lang="c">
<lang c>/* LabProt.h */
#include "DogProt.h"
/** * * * * * * * * * * * * * * * * * *
Line 214 ⟶ 226:
};
 
extern sClass labc;</lang>
</syntaxhighlight>
<lang c>/* Lab.c */
 
<syntaxhighlight lang="c">
<lang c>/* Lab.c */
#include "LabProt.h"
 
Line 245 ⟶ 260:
}
return (Animal)dog;
}</langsyntaxhighlight>
 
<lang c>/* Lab.h */
<syntaxhighlight lang="c">
<lang c>/* Lab.h */
#include "Dog.h"
extern Animal NewLab(char *name, char *color, double weight);</lang>
</syntaxhighlight>
 
<syntaxhighlight lang="c">
<lang c>/* CollieProt.h */
/** * * * * * * * * * * * * * * * * * *
* Collie - a class derived from Dog
Line 268 ⟶ 287:
};
 
extern sClass colliec;</lang>
</syntaxhighlight>
<lang c>/* Collie.c */
 
<syntaxhighlight lang="c">
<lang c>/* Collie.c */
#include "CollieProt.h"
 
Line 299 ⟶ 321:
}
return (Animal)dog;
}
}</lang>
</syntaxhighlight>
<lang c>/* Collie.h */
 
<syntaxhighlight lang="c">
<lang c>/* Collie.h */
#include "Dog.h"
extern Animal NewCollie(char *name, char *color, double weight, double height);</lang>
</syntaxhighlight>
 
<syntaxhighlight lang="c">
<lang c>/* CatProt.h */
#include "AnimalProt.h"
/* * * * * * * * * * * * */
Line 322 ⟶ 349:
};
 
extern sClass catcls;</lang>
</syntaxhighlight>
<lang c>/* Cat.c */
 
<syntaxhighlight lang="c">
<lang c>/* Cat.c */
#include "CatProt.h"
 
Line 372 ⟶ 402:
}
 
/** * Now wasn' that fun. * **/</lang>
</syntaxhighlight>
<lang c>/* Cat.h */
 
<syntaxhighlight lang="c">
<lang c>/* Cat.h */
#include "Animal.h"
extern Animal NewCat(char *name, char *color, int age);</lang>
</syntaxhighlight>
 
<syntaxhighlight lang="c">
<lang c>#include "Cat.h"
#include "Lab.h"
#include "Collie.h"
Line 399 ⟶ 434:
 
return 0;
}</langsyntaxhighlight>