上一篇:http://www.BkJia.com/kf/201301/184226.html
接口(interface)對行為進行抽象,利用它可以實現類的多態性,imeas.h定義了一個測量周長和面積的接口:
[cpp]
#ifndef __IMEAS_H__
#define __IMEAS_H__
#include "oosm.h"
/* Measuring Interface, for measuring the perimeter and area of objects */
interface(imeas)
{
double (*peri)(void* this); /* for measuring the perimeter of objects */
double (*area)(void* this); /* for measuring the area of objects */
};
#endif/*__IMEAS_H__*/
由於接口是抽象的,所以特別注意把this指針聲明為void*類型,這樣在進行指針轉換的時候會比較方便。
類(class)擁有屬性和方法,多態方法采用實現接口的方式來達成目的,crect.h/crect.c定義和實現了一個矩形類:
[cpp]
#ifndef __CRECT_H__
#define __CRECT_H__
#include "imeas.h"
/* Rectangle Class, for describing rectangle objects */
class(crect)
{
implements(imeas); /* Implements imeas interface */
double width;
double height;
};
#endif/*__CRECT_H__*/
[cpp]
#include "crect.h"
static double peri(void* this)
{
return 2 * (((crect*)this)->width + ((crect*)this)->height);
}
static double area(void* this)
{
return ((crect*)this)->width * ((crect*)this)->height;
}
constructor(crect)
{
mapping(imeas.peri, peri);
mapping(imeas.area, area);
}
destructor(crect)
{
return 1; /* Returns 1 for freeing the memory */
}
矩形類構造(constructor)時主要是進行方法的映射,這裡實現的是接口imeas中的方法,所以特別注意映射時寫成imeas.peri/imeas.area,構造後會自動生成crect_new宏函數。析構(destructor)中可以先釋放內部的空間後再返回1刪除自身,析構後會自動生成crect_delete宏函數。
同樣的,ccir.h/ccir.c定義是實現了圓形類:
[cpp]
#ifndef __CCIRC_H__
#define __CCIRC_H__
#include "imeas.h"
/* Circle Class, for describing circular objects */
class(ccirc)
{
implements(imeas); /* Implements imeas interface */
double radius;
double (*diam)(ccirc* this); /* for measuring the diameter of the circular objects */
};
#endif/*__CCIRC_H__*/
[cpp]
#include "ccirc.h"
#define PI (3.1415926)
static double peri(void* this)
{
return 2 * PI * ((ccirc*)this)->radius;
}
static double area(void* this)
{
return PI * ((ccirc*)this)->radius * ((ccirc*)this)->radius;
}
static double diam(ccirc* this)
{
return 2 * this->radius;
}
constructor(ccirc)
{
mapping(imeas.peri, peri);
mapping(imeas.area, area);
mapping(diam, diam);
}
destructor(ccirc)
{
return 1; /* Returns 1 for freeing the memory */
}
圓形類在實現imeas接口的基礎上,另有自己的diam方法,注意自己本身方法直接映射即可。