C++中的接口一般設計為不包含成員變量的抽象類,這樣就只有接口的功能。
接口設計盡量不要涉及到成員變量,接口與實現(xiàn)要盡可能的分離,實現(xiàn)部分改變,不需要重現(xiàn)編譯!
代碼如下:`
class PERSONDLL_EXPORT PersonApi
{
public:
static PersonApi* CreatePersonApi();
static void DeletePersonApi(PersonApi** ppAPi);
virtual void SetAge(int nAGe) = 0;
virtual void SetName(char* chName) = 0;
virtual int GetAge() = 0;
virtual char* GetName() = 0;
virtual void DoWork() = 0;
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
上面是接口部分,實現(xiàn)部分,采取橋接模式,提供一個IMPL類與接口類有一模一樣的方法
通常的做法是另外定義一個新的類,其接口和原來的類一致,但是其數(shù)據(jù)全部隱藏在新的類中。例如我們定義A類,然后定義一個新類B和其有相同的接口,其數(shù)據(jù)成員都在新類中。引用A類的代碼就不需要重新編譯。
PersonApiImpl.h文件
class PersonImplApi : public PersonApi
{
public:
PersonImplApi();
virtual ~PersonImplApi();
virtual void SetAge(int nAGe);
virtual void SetName(char* chName);
virtual int GetAge();
virtual char* GetName();
virtual void DoWork();
private:
int m_nAge;
std::string m_strName;
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
PersonApiImpl.cpp文件
#include "stdafx.h"
#include "PersonImplApi.h"
PersonImplApi::PersonImplApi()
{
}
PersonImplApi::~PersonImplApi()
{
}
PersonApi* PersonApi::CreatePersonApi()
{
return new PersonImplApi();
}
void PersonApi::DeletePersonApi(PersonApi** ppAPi)
{
if (NULL == ppAPi)
{
return;
}
PersonImplApi *pImpl = (PersonImplApi *)*ppAPi;
delete pImpl;
*ppAPi = NULL;
return;
}
void PersonImplApi::SetAge(int nAGe)
{
m_nAge = nAGe;
}
void PersonImplApi::SetName(char * chName)
{
m_strName = chName;
}
int PersonImplApi::GetAge()
{
return m_nAge;
}
char * PersonImplApi::GetName()
{
return (char*)m_strName.c_str();
}
void PersonImplApi::DoWork()
{
printf("system start work!\n");
}