ATL / COM:我可以在同一个对象的两个不同接口中使用相同的功能吗?

时间:2009-11-13 20:33:02

标签: com interface atl

我有一个基于ATL / COM的DLL,用VC ++ 6.0编写。直到最近,我的COM接口和类之间存在一对一的对应关系。例如,假设有一个ICar接口;然后还有一个实现它的CCar类,除了CCar之外没有其他类实现ICar,CCar除了ICar之外没有实现任何接口(我的)。同样,IPlane和CPlane。定义可能类似于:

ICar有“StepOnGas”和“MaxPassengers”功能; IPlane的功能是“LowerLandingGear”和“MaxPassengers”。

最近,我更改了它,以便有一个IVehicle接口,它没有相应的CVehicle类,CCar和CPlane都实现了。所以:

ICar有“StepOnGas”; IPlane拥有“LowerLandingGear”; IVehicle有“MaxPassengers”。 CCar实施ICar和IVehicle; CPlane实施了IPlane和IVehicle。

这很好用,但从DLL客户端的角度来看,这有点痛苦;他们有一辆ICar,他们想知道它可以容纳多少乘客。以前,他们可以问一下;现在,他们必须跳过将它改成IVehicle才能问它的箍。

所以我想做的更多的是:

ICar有“StepOnGas”和“MaxPassengers”; IPlane拥有“LowerLandingGear”和“MaxPassengers”; IVehicle有“MaxPassengers”。 CCar仍然实现了ICar和IVehicle,而且CPlane仍然实现了IPlane和IVehicle。

我希望CCar只有一个“MaxPassengers”,并且可以从ICar和IVehicle访问它;同样,只有一个“MaxPassengers”用于CPlane,它可以从IPlane和IVehicle访问。

这会导致任何问题吗?除了将“MaxPassengers”添加到ICar和IPlane的IDL之外,我还需要做任何具体的事情吗?

如果重要,此DLL的客户端都是用VC ++ 6.0和VB6编写的。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

简单回答:是的,你可以

更好的是:你为什么不从IVehicle继承ICar,也就是说你可以用新的方法扩展 IVehicle并命名为ICar。这样,您的对象可以为两个接口进行QI,而ICar将拥有客户端操作对象所需的所有方法。这也允许ICar升级到IVehicle,因此两个接口都可以共享一个实现(即访问ICar和IVehicle上的MaxPassengers执行相同的C ++方法)。

对于IPlane也是如此,但扩展名将包含不同的方法。