#include <draw3.h> #include <stdio.h> #include <stdlib.h> /*************************************************************/ /* Renvoi le numero de type qui correspond a un object draw3 */ uint32 draw3_type(void) { static uint32 draw3_type_num = 0; if(draw3_type_num == 0) { draw3_type_num = object_num_new; } return(draw3_type_num); } /*************************************************************/ void draw3_fun1(obj_ofs *this) { /* on utilise aucun attributs, methodes de l'objet => pas de recherche. */ printf("fun1 surcharge dans draw3\n"); } void draw3_fun3(obj_ofs *this) { /* on utilise aucun attributs, methodes de l'objet => pas de recherche. */ printf("fun3\n"); } void call_draw3_fun3(obj_ofs *this) { int i; draw3 *vdraw3; /* si on veut acceder a un champ de draw3 */ for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw3_type());i++); /* on peut meme faire une petite verification dynamique de l'objet */ /* pour verifier si cet objet peut bien etre considere comme un "draw3" */ if(this[i].obj_type == 0) { fprintf(stderr,"call_draw3_fun3 (draw3.c) : invalide draw3\n"); exit(2); } vdraw3 = (draw3 *)this[i].ofs; /* on appele la fonction correspondante */ vdraw3->fun3(this); } /* ce que l'on peut voir comme le constructeur de l'objet */ void draw3_init(obj_ofs *this) { int i; draw1 *vdraw1; draw3 *vdraw3; /* on appele les constructeurs des parents. */ /* l'ordre est tres important. */ object_init(this); draw_init(this); draw2_init(this); /* la fonction display de draw est surcharge dans draw1 */ /* et draw2. Si on initialise draw1 en dernier, c'est la */ /* surcharge de draw1 qui gagne. C'est la resolution des */ /* conflits par priorite (draw1 prioritaire sur draw2) */ draw1_init(this); /* si on veut acceder a un champ de draw1 */ for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw1_type());i++); /* on peut meme faire une petite verification dynamique de l'objet */ /* pour verifier si cet objet peut bien etre considere comme un "draw1" */ if(this[i].obj_type == 0) { fprintf(stderr,"draw3_init (draw3.c) : invalide draw1\n"); exit(2); } vdraw1 = (draw1 *)this[i].ofs; /* si on veut acceder a un champ de draw3 */ for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != draw3_type());i++); /* on peut meme faire une petite verification dynamique de l'objet */ /* pour verifier si cet objet peut bien etre considere comme un "draw3" */ if(this[i].obj_type == 0) { fprintf(stderr,"draw3_init (draw3.c) : invalide draw3\n"); exit(2); } vdraw3 = (draw3 *)this[i].ofs; /* on initialise les attributs et les methodes */ vdraw1->fun1 = draw3_fun1; /* on fait notre surcharge */ vdraw3->draw3_att = 55; vdraw3->fun3 = draw3_fun3; } /* la fonction qui permet de creer un nouvel objet draw3 */ obj_ofs *draw3_new(void) { obj_ofs *vobj_table; pointer mem; /* allocation de la memoire pour l'objet */ if((mem = (pointer)malloc(sizeof(obj_ofs)*6+sizeof(object)+sizeof(draw)+ sizeof(draw1)+sizeof(draw2)+sizeof(draw3))) == NULL) { perror("malloc failed "); exit(1); } /* table des objets */ vobj_table = (obj_ofs *)mem; /* pour la partie uniquement object */ vobj_table[0].obj_type = object_type(); vobj_table[0].ofs = mem + sizeof(obj_ofs)*6; /* pour la partie draw "seulement" de l'objet draw3 */ vobj_table[1].obj_type = draw_type(); vobj_table[1].ofs = mem + sizeof(obj_ofs)*6 + sizeof(object); /* pour la partie draw1 "seulement" de l'objet draw3 */ vobj_table[2].obj_type = draw1_type(); vobj_table[2].ofs = mem + sizeof(obj_ofs)*6 + sizeof(object) + sizeof(draw); /* pour la partie draw2 "seulement" de l'objet draw3 */ vobj_table[3].obj_type = draw2_type(); vobj_table[3].ofs = mem + sizeof(obj_ofs)*6 + sizeof(object) + sizeof(draw) + sizeof(draw1); /* pour la partie draw3 "seulement" de l'objet draw3 */ vobj_table[4].obj_type = draw3_type(); vobj_table[4].ofs = mem + sizeof(obj_ofs)*6 + sizeof(object) + sizeof(draw) + sizeof(draw1) + sizeof(draw2); /* le dernier sert a delimiter la table des objets */ /* aucun objet n'est identifie par la clee 0 donc pas d'ambiguite */ vobj_table[5].obj_type = 0; /* on fait appel au constructeur de l'objet draw1 */ draw3_init(vobj_table); /* et voila un nouvel objet */ return(vobj_table); }