We have a parent "class" with virtual functions KNameList
and need to create a child class (KNodeNameList
).
KNameList
has the following virtual functions
declared in itf/kcont/namelist.h
(parent class public interface):
int KNameListRelease ( const KNameList *self );
int KNameListCount ( const KNameList *self, uint32_t *count );
int KNameListGet ( const KNameList *self, uint32_t idx, const char **name );
The file itf/kcont/impl.h
contains "class protected" part to be used by derived classes.
It has:
struct KNameList
definitionstruct KNameList_vt_v1
i.e. virtual table definitionint KNameListInit ( KNameList *self, const KNameList_vt *vt );
To create child objects we declare a factory method:
int KXMLNodeListAttr ( const KXMLNode *self, struct KNameList const **result );
It is a function of KXMLNode
"class" that creates
KNameList
objects of our derived KNodeNameList
type.
Child class .c file contains:
KXMLNodeListAttr()
definitionAll of these objects and functions are static within the file.
struct KNodeNameList { KNameList dad; struct _xmlAttr* properties; struct _xmlNode* children; };
static int s_KNodeNameListRelease ( KNodeNameList *self ) { return kxmlNoErr; } static int s_KNodeNameListCount ( const KNodeNameList *self, uint32_t *count ) { return kxmlNoErr; } static int s_KNodeNameListGet ( const KNodeNameList *self, uint32_t idx, const char **name ) { return kxmlNoErr; }
static KNameList_vt_v1 s_vtKNodeNameList = { /* version 1.0 */ 1, 0, /* start minor version 0 methods */ ( int ( * ) ( KNameList* ) ) s_KNodeNameListRelease, ( int ( * ) ( const KNameList*, uint32_t* ) ) s_KNodeNameListCount, ( int ( * ) ( const KNameList*, uint32_t, const char** ) ) s_KNodeNameListGet /* end minor version 0 methods */ };
int KXMLNodeListAttr ( const KXMLNode *self, struct KNameList const **result ) { KNodeNameList* obj = (KNodeNameList*) malloc(sizeof(KNodeNameList)); int status = KNameListInit(&obj->dad, (const KNameList_vt*) &s_vtKNodeNameList); *result = obj; return kxmlNoErr; }