#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");
}
stdafx.h
#pragma once
#include <iostream>
#include <tchar.h>
#include <objbase.h>
非介面通訊
不知讀者是否還記得前面我們提到過:客戶和組件之間只是通過介面進行通訊。但程式清單中的客戶卻沒有遵循這一規則。在那裡,客戶與組件間的通訊是通過一個指向類 CA 的指標而不是通過指向介面的指標完成的。使用指向 CA 的指標要求客戶知道類以的定義(通常是一個標頭檔)。在類 cA 的聲明中有許多有關實現的細節。對這些實現細節的修改將使得客戶必須被重新編譯。但前面已經講過,增加或減少組件的介面不應打斷已有的客戶。這就是我們為什麼一再堅持客戶和組件之間只應通過介面進行通訊。記住,介面是由沒有實現細節的虛純基類實現的。