接口需求
在软件开发这个行业中,一个较大的软件项目,一般由几个小组共同开发完成,为了将小组之间的影响降低到最低,定义好接口势在必行,如若要求短时间开发完成,定义好接口更是如此。或者说你的客户要求为其提供实现某个功能的接口,然后再在这些接口的基础上进行二次开发,如何定义才能定义好的接口呢? 第一,接口名字和实际的功能相符合;第二、接口要对数据进行封装,不允许客户直接操作接口之下的数据,尤其是使用new和delete在堆上操作内存数据。因为客户很容易由于操作不当造成错误,误以为是设计的接口有问题。
接口与实现分离
c++中实现对接口与实现进行分离有两种方法,一种是将对象的实现细目隐藏于指针背后,简单的说就是将其分成两个类,一个类只提供接口,另一个负责实现该接口,这种设计手法常称为Pimpl Idiom(pointer to implementation)。
另一种方法就是将接口定义为抽象类,接口全被定义为纯虚函数(纯虚函数没有具体的实现方法),派生类的成员函数负责实现这些接口。这种设计手法称为Object Interface。千万不要忘记把抽象接口类的析构函数定义为virtual函数,可能会造成内存泄漏。
Pimpl Idiom手法
下面举个简单的例子,要求实现一个Person接口,其要包含如下四个函数:
string& getName() const;
void setName(string& name);
int getAge() const;
void setAge(int age);
它们的功能是设置获取名字和年龄。其声明在Person.h文件中,具体接口如下:
#include<string>
class PersonImpl;
using namespace std;
class Person {
public:
Person(string& name, int age);
virtual ~Person();
string& getName() const;
void setName(string& name);
int getAge() const;
void setAge(int age);
private:
PersonImpl *mPersonImpl;
};
Person.cpp文件中定义了具体函数接口,其内容如下:
#include "Person.h"