(转)通过多重继承实现多接口时,解决名字冲突的一种设计模式(forwarding shim)
通过多重继承实现多接口时,解决名字冲突的一种设计模式
例:ICar接口有一个GetMaxSpeed方法。IBoot也有GetMaxSpeed方法,而且他们具有同样的原型,这意味着在使用多重继承时,类的实现这只能编写一个GetMaxSpeed方法,然后编译器和连接器将会初始化ICar和IBoat的vtbl,使他们的GetMaxSpeed表项都指向这个实现。
这种行为对于大多数的实现来说是非常合理的,但是如果对象需要根据被请求的接口类型的不同,而返回不同的最大速度,该怎么办?
一种常用的技术:建立一个中间C++类,让他从某一个接口继承,然后实现名字发生冲突的方法,但是这个方法只是简单地调用另一个不会发生名字冲突的虚函数,而在继承类中并不实现发生名字冲突的方法。
这种行为对于大多数的实现来说是非常合理的,但是如果对象需要根据被请求的接口类型的不同,而返回不同的最大速度,该怎么办?
一种常用的技术:建立一个中间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本质论
浙公网安备 33010602011771号