钝然

(转)通过多重继承实现多接口时,解决名字冲突的一种设计模式(forwarding shim)

通过多重继承实现多接口时,解决名字冲突的一种设计模式

例:ICar接口有一个GetMaxSpeed方法。IBoot也有GetMaxSpeed方法,而且他们具有同样的原型,这意味着在使用多重继承时,类的实现这只能编写一个GetMaxSpeed方法,然后编译器和连接器将会初始化ICar和IBoat的vtbl,使他们的GetMaxSpeed表项都指向这个实现。
这种行为对于大多数的实现来说是非常合理的,但是如果对象需要根据被请求的接口类型的不同,而返回不同的最大速度,该怎么办?
一种常用的技术:建立一个中间C++类,让他从某一个接口继承,然后实现名字发生冲突的方法,但是这个方法只是简单地调用另一个不会发生名字冲突的虚函数,而在继承类中并不实现发生名字冲突的方法。
 1 struct IXCar:public ICar{
 2     //增加新的非冲突纯虚方法
 3     virtual HRESULT GetMaxCarSpeed(long *pVal)=0;
 4     //通过在派生类中调用非冲突方法实现冲突方法
 5     HRESULT GetMaxSpeed(long *pVal)
 6     {return GetMaxCarSpeed(pVal);}
 7 }
 8 
 9 
10 同样实现IXBoot后,派生类如下实现:
11 class CarBoot:public IXCar,
12               public IXBoot{
13 public:
14     .........
15     HRESULT GetMaxCarSpeed(long *pVal);
16     HRESULT GetMaxBootSpeed(long *pVal);
17 }

这种技术叫做转发垫片(forwarding shim)

 

参考文献:

 

1。“essential com”中译本-COM本质论

转自:http://blog.chinaunix.net/uid-20295309-id-1968211.html

posted on 2012-08-15 19:19  钝然  阅读(381)  评论(0)    收藏  举报