类是C++中的主要单元,类包括行为方法和数据成员。我们经常会将数据成员置为private或protected属性,防止客户贸然闯入修改数据。但C++语法要求必须将数据成员和方法都放在一个类的定义中,这样就会将类的一些内部细节暴露给它的用户。使用接口类的好处是可以让用户只需要知道类具有哪些功能而不用管它的内部怎样实现的。再则,如果你写的类供别人使用,但又不希望使用者知道类的实现过程,就可以用接口类来隐藏实现类的内部细节。
1)先写一个简单的没有使用接口的类:
//myclass.h
class myclass
{
public:
myclass();
virtual ~myclass();
void setValue(int x);
int getValue();
//其他函数
private:
int mValue;
//其他数据成员
};
2)现在就1)的类我们来为它实现一个接口类。为了类名一致,我们接口类的类名为myclass。而内部实现类为myclassImpl,myclassImpl类和1)中的类完全一样,只是类名不同而已。
//myclassImpl.h
class myclassImpl
{
public:
myclassImpl();
virtual ~myclassImpl();
void setValue(int x);
int getValue();
//其他函数
private:
int mValue;
//其他数据成员
};
现在,关键是怎样为myclassImpl类定义一个接口类。接口类提供实现类的公共方法,但它只有一个数据成员,即指向实现类myclassImpl的指针。接口类中的方法只是调用实现类中的相应方法。接口类myclass如下:
//myclass.h
class myclass
{
public:
myclass();
virtual ~myclass();
void setValue(int x);
int getValue();
//其他函数
private:
myclassImpl* mImpl; //指向实现类对象的指针
};
接口类中的方法只是通过指针mImpl简单的调用实现类中的方法,如:
void myclass::setValue(int x)
{
mImpl->setValue(int x);
}
int myclass::getValue()
{
return(mImpl->getValue());
}
//其他函数的实现
但接口类的构造函数必须构造一个新的myclassImpl对象来完成工作,且析构函数必须释放动态分配的内存。
myclass::myclass()
{
mImpl=new myclassImpl();
}
myclass::~myclass()
{
delete Impl;
Impl=NULL;
}
最后,需要注意的是:接口类中由于除了类指针外没有其他数据成员,所以有些特殊情况时就需要作相应的改动。如在实现类中的数据成员包含常量用来作为某函数参数的默认值时,在接口类中就要将此函数重载来应对用户传参或不传参的情况。当然,只要把握好了以上方法,在实践过程中遇到的特殊情况我想你都会很从容的面对。