这里将实现派生类的2个特性:
1 子类型可以转换为父类型。
2 子类型覆盖父类型的方法实现多态。
1 子类型可以转换为父类型。
2 子类型覆盖父类型的方法实现多态。
MyThread1Class.h
/****************************
* Black Spoor *
****************************/
* Black Spoor *
****************************/
#ifndef _BLACKSPOOR_MYTHREAD1CLASS_H_
#define _BLACKSPOOR_MYTHREAD1CLASS_H_
#define _BLACKSPOOR_MYTHREAD1CLASS_H_
#include "ZThreadClass.h"
typedef struct MyThread1Class
{
ZThreadClass thread;
ZThreadClass * threadptr;
{
ZThreadClass thread;
ZThreadClass * threadptr;
void(*Init)(struct MyThread1Class *);
void(*Dispose)(struct MyThread1Class *);
void(*Dispose)(struct MyThread1Class *);
}MyThread1Class;
extern MyThread1Class * MyThread1ClassCreate(void);
#endif
MyThread1Class.c
/****************************
* Black Spoor *
****************************/
* Black Spoor *
****************************/
#include "MyThread1Class.h"
static void Init(struct MyThread1Class *);
static void Dispose(struct MyThread1Class *);
static void Dispose(struct MyThread1Class *);
static void DoSomething(void *);
static void CreateResource(void *);
static void RemoveResource(void *);
static void CreateResource(void *);
static void RemoveResource(void *);
static void Init(struct MyThread1Class * stu)
{
ZThreadClass * th = &(stu->thread);
ZThreadClassInit(th);
th->Init(th);
{
ZThreadClass * th = &(stu->thread);
ZThreadClassInit(th);
th->Init(th);
th->obj = stu; //这里的obj是MyThread1Class类型的,在ZThreadClass类方法(ZThread)里,obj将被转换为ZThreadClass类型。
/*
以下三条语句,给ZThreadClass的函数指针赋值,相当于覆盖了ZThreadClass类的方法。
*/
th->VirtualDoSomething = DoSomething;
th->VirtualCreateResource = CreateResource;
th->VirtualRemoveResource = RemoveResource;
}
/*
以下三条语句,给ZThreadClass的函数指针赋值,相当于覆盖了ZThreadClass类的方法。
*/
th->VirtualDoSomething = DoSomething;
th->VirtualCreateResource = CreateResource;
th->VirtualRemoveResource = RemoveResource;
}
static void Dispose(struct MyThread1Class * stu)
{
stu->thread.Dispose(&stu->thread);
free(stu);
}
{
stu->thread.Dispose(&stu->thread);
free(stu);
}
//线程执行的任务
static void DoSomething(void * obj)
{
MyThread1Class * stu = (MyThread1Class *)obj;
printf("线程 %s 正在运行 \n", stu->thread.threadName);
stu->thread.ZSleep(300);
}
static void DoSomething(void * obj)
{
MyThread1Class * stu = (MyThread1Class *)obj;
printf("线程 %s 正在运行 \n", stu->thread.threadName);
stu->thread.ZSleep(300);
}
//创建资源
static void CreateResource(void * obj)
{
MyThread1Class * stu = (MyThread1Class *)obj;
printf("线程 %s 创建资源。 \n",stu->thread.threadName);
}
static void CreateResource(void * obj)
{
MyThread1Class * stu = (MyThread1Class *)obj;
printf("线程 %s 创建资源。 \n",stu->thread.threadName);
}
//删除资源
static void RemoveResource(void * obj)
{
MyThread1Class * stu = (MyThread1Class *)obj;
printf("线程 %s 删除资源。\n", stu->thread.threadName);
}
static void RemoveResource(void * obj)
{
MyThread1Class * stu = (MyThread1Class *)obj;
printf("线程 %s 删除资源。\n", stu->thread.threadName);
}
MyThread1Class * MyThread1ClassCreate(void)
{
MyThread1Class * stu = (MyThread1Class *)malloc(sizeof(MyThread1Class));
memset(stu, 0, sizeof(MyThread1Class));
{
MyThread1Class * stu = (MyThread1Class *)malloc(sizeof(MyThread1Class));
memset(stu, 0, sizeof(MyThread1Class));
stu->Init = Init;
stu->Dispose = Dispose;
stu->Dispose = Dispose;
stu->threadptr = &stu->thread;
return stu;
}
}
struct MyThread1Class结构体的第一个成员是ZThreadClass thread,这样定义结构体,可以使以下语句正常运行:
MyThread1Class * subClass = MyThread1ClassCreate();
ZThreadClass * parentClass = (ZThreadClass *) subClass;
ZThreadClass * parentClass = (ZThreadClass *) subClass;
这样就实现了子类型转换为父类型的效果。