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;
}