OOPC-一个类实现多个接口(multiple interface)

一个类实现多个接口,这段程序用自己的方法实现了,但是最后主函数那块没看太明白,若有路过的大神,看到了麻烦留下您的高见,下面代码通过两个接口分别计算一个对象(矩形)的面积和周长,具体代码如下:
1、计算面积的接口

#ifndef __C14IB_H__
#define __C14IB_H__

typedef struct
{
     
	void (*init)(void*, double, double);
	double (*cal_area)(void*);
}IB_t;

#endif

2、计算周长接口

#ifndef __C14IC_H__
#define __C14IC_H__


typedef struct
{
     
	void (*init)(void*, double ,double);
	double (*cal_perimeter)(void*);
}IC_t;

#endif

3、下面定义一个类,同时支持上述两个接口,并且可以相互转换,具体如何转换,这就是我的问题,没看太明白,代码如下:

#ifndef __C14ALL_H__
#define __C14ALL_H__

#include "c14ic.h"
#include "c14ib.h"

typedef struct
{
     
	IB_t Ib;
	IC_t Ic;
	
}IALL_t;

#endif

4、下面定义一个矩形的类然后抽象出具体对象

#ifndef __C14REC_H__
#define __C14REC_H__
#include "c14all.h"

typedef struct
{
     
	IC_t Ic;
	IB_t Ib;

	double lenth;
	double width;
	void (*display)(char*,double);
	
}REC_t;

void *RecNew(void);

#endif

5、实现类的方法

#include 
#include 
#include "c14rec.h"

static void init(void *t, double length, double width)
{
     
	REC_t *cthis = (REC_t*)t;
	
	cthis->lenth = length;
	cthis->width = width;
}
static double calculate_area(void *t)
{
     
	REC_t *cthis = (REC_t*)t;
	double s;

	s = (cthis->lenth) * (cthis->width);
	cthis->display("area ",s);

	return s;
}

static double calculate_perimeter(void *t)
{
     
	REC_t *cthis = (REC_t *)t;
	double p;

	p = ((cthis->lenth) + (cthis->width)) * 2;
	cthis->display("perimeter",p);

	return p;
}

static void display(char *str, double d)
{
     
	printf("%s=%7.2f\n",str,d);
}

void *RecNew(void)
{
     
	REC_t *t;

	t= (REC_t*)malloc(sizeof(REC_t));

	t->display = display;
	t->Ib.init = init;
	t->Ib.cal_area = calculate_area;
	t->Ic.init = init;
	t->Ic.cal_perimeter = calculate_perimeter;

	return (void*)t;
}

6、主函数

#include 
#include "c14all.h"
#include "c14rec.h"

int main()
{
     
	IB_t *pb;
	IC_t *pc;
	IALL_t *pa;
	double a;

	pb = (IB_t *)RecNew();
	
	pb->init(pb, 20.0,10.0);
	a = pb->cal_area(pb);

	pa = (IALL_t*)pb;
	pc = &(pa->Ic);
	a= pc->cal_perimeter(pa);
	
	
	return 0;
}

在主函数中,pb正指向矩形对象的面积接口IB_t;初始化对象,计算出对象的面积。再讲pb传到指向两个共同接口的pa,然后再从pa传到指向IC_t的pc值,最后直接调用pc计算出周长;这里貌似转换的很漂亮,但是容易让人迷糊,我再刚开始调试过程中也出错了,比如a= pc->cal_perimeter(pa);传入pa就传错了。所以希望哪位路过的大神能够指点迷津!

你可能感兴趣的:(OOPC,类,多态,数据结构,c++)