#include
"
stdafx.h
"
using namespace std;
// abstract interfaces
interface IX
... {
virtual void _stdcall Fx1()=0;
virtual void _stdcall Fx2()=0;
} ;
interface IY
... {
virtual void _stdcall Fy1()=0;
virtual void _stdcall Fy2()=0;
} ;
void trace( const char * pMsg) ... {cout<<pMsg<<endl;} ;
// interface implementation
class CA: public IX, public IY
... {
public :
//implement interface IX
virtual void _stdcall Fx1()...{cout<<"CA::Fx1"<<endl;}
virtual void _stdcall Fx2()...{cout<<"CA::Fx2"<<endl;}
//implement interface IY
virtual void _stdcall Fy1()...{cout<<"CA::Fy1"<<endl;}
virtual void _stdcall Fy2()...{cout<<"CA::Fy2"<<endl;}
} ;
int main()
... {
trace("client create an instance of the component");
CA* pa=new CA;
//get an ix pointer
IX *pix=pa;
trace("client:use the IX interface");
pix->Fx1();
pix->Fx2();
//get an iy pointer
trace("client use the iy interface");
IY *piy=pa;
piy->Fy1();
piy->Fy2();
system("pause");
}
using namespace std;
// abstract interfaces
interface IX
... {
virtual void _stdcall Fx1()=0;
virtual void _stdcall Fx2()=0;
} ;
interface IY
... {
virtual void _stdcall Fy1()=0;
virtual void _stdcall Fy2()=0;
} ;
void trace( const char * pMsg) ... {cout<<pMsg<<endl;} ;
// interface implementation
class CA: public IX, public IY
... {
public :
//implement interface IX
virtual void _stdcall Fx1()...{cout<<"CA::Fx1"<<endl;}
virtual void _stdcall Fx2()...{cout<<"CA::Fx2"<<endl;}
//implement interface IY
virtual void _stdcall Fy1()...{cout<<"CA::Fy1"<<endl;}
virtual void _stdcall Fy2()...{cout<<"CA::Fy2"<<endl;}
} ;
int main()
... {
trace("client create an instance of the component");
CA* pa=new CA;
//get an ix pointer
IX *pix=pa;
trace("client:use the IX interface");
pix->Fx1();
pix->Fx2();
//get an iy pointer
trace("client use the iy interface");
IY *piy=pa;
piy->Fy1();
piy->Fy2();
system("pause");
}
stdafx.h
#pragma once
#include <iostream>
#include <tchar.h>
#include <objbase.h>
非接口通信
不知读者是否还记得前面我们提到过:客户和组件之间只是通过接口进行通信。但程序清单中的客户却没有遵循这一规则。在那里,客户与组件间的通信是通过一个指向类 CA 的指针而不是通过指向接口的指针完成的。使用指向 CA 的指针要求客户知道类以的定义(通常是一个头文件)。在类 cA 的声明中有许多有关实现的细节。对这些实现细节的修改将使得客户必须被重新编译。但前面已经讲过,增加或减少组件的接口不应打断已有的客户。这就是我们为什么一再坚持客户和组件之间只应通过接口进行通信。记住,接口是由没有实现细节的虚纯基类实现的。